前言
本篇文章主要是分享matplotlib折线图、散点图、误差图、轮廓图、柱状图、饼图、面积图、直方图、雷达图、热力图、词云图、箱型图多子图绘制过程的方法和注意要点
示例图
模块库
导入十二个子图所需的模块库
matplotlib用于绘制图形
import matplotlib.pylot as plt #安装模块库 pip install matplotlib
numpy、random用于生成随机数据
import numpy as np #安装模块库:pip install numpy
import random #系统自带
logging、jieba、wordcloud只用于用于子图11的词云图
import logging #系统自带
import jieba #安装模块库:pip install jieba
from wordcloud import WordCloud #安装模块库:pip install wordcloud
注意:wordcloud若无法顺利安装,请自行查询百度、CSDN安装方式
参考链接:wordcloud安装过程及常见问题汇总
画布图形设置
fig,ax = plt.subplots(num='matplotlib 二维图形设计练习',
nrows=3,ncols=4,
figsize=(20,10),dpi=80,
edgecolor=None,
frameon=False
)
ax1,ax2,ax3,ax4,ax5,ax6,ax7,ax8,ax9,ax10,ax11,ax12 = ax.flatten()
plt.subplots() 创建子图表
num 设置画布名称
nrows、ncols 设置横纵向子图数量
figsize、dpi 设置画布大小和分辨率
edgecolor 画布边框颜色
frameon 是否绘制画布图框
参考链接:python 可视化:fig, ax = plt.subplots()画多表图的3中常见样例 & 自定义图表格式
ax.flatten() 设置大小相同的子图
参考链接:plt.subplots中的ax = ax.flatten()
中文显示设置
simhei为window自带字体,默认字体文件存放处:C:\Windows\Fonts(如果不一样,可自行百度查找)
matplotlib一共有三种中文显示方式
方式一:把下面的代码放在导入模块后面,
import matplotlib.pyplot as plt
import numpy as np
import random
import logging #只有图11要用
import jieba #只有图11要用
from wordcloud import WordCloud #只有图11要用
#中文显示设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
plt.rcParams['font.size'] = '16' #用于设置中文大小
方式二:在每个需要用到中文的地方,手动设置中文字体
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=20)
plt.title('标题中文',fontproperties=fonts)
plt.annotate('注释中文',fontproperties=fonts)
plt.legend()...
plt.xticklabel...
plt.yticklabel... 等等
方式三:
执行这串代码然后将simhei.ttf 字体文件放到这里面:\matplotlib \mpl-data\fonts\ttf
import matplotlib
print(matplotlib.get_data_path()) # 数据路径
然后退回到这个地方\matplotlib \mpl-data,打开”matplotlibrc”
Ctrl + R 可以快速定位!!!!
font.family:
font.sans-serif:
axes.unicode_minus:
把这三个地方前面的”#”注释符号去掉,然后改成下面这样
font.family:sans-serif
font.sans-serif:SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
axes.unicode_minus:False,#作用就是解决负号'-'显示为方块的问题
在代码前面加入这个
from matplotlib.font_manager import _rebuild
资料参考链接:
方式二最为麻烦,方式三分享代码时,执行代码的主机也需这样设置,建议采用方式一
折线图
图形绘制特点
该图以绘制cos()和sin()两条线说明折线图的线型设置
增加图例、标题、轴名称等辅助说明图形
修改标题位置,X轴位置,隐藏部分边框用于美化图形
添加注释,用于突出图形某个特殊值
设置数据,用于两条线的X轴和Y轴
#设置数据
x1 = np.linspace(0,2 * np.pi,100)
y1 = np.linspace(0,10,20)
折线图的绘制语法:plt.plot()或ax.plot()
plt.plot(x,y,color,linestyle,linewidth,marker,**kw)
#绘制图形
ax1.plot(x1,np.sin(x1),color="b",linestyle='--',label='$sin(x)$')
ax1.plot(x1,np.cos(x1),'r-.',label='$cos(x)$')
color:颜色
linestyle:线型
linewidth:线宽
label:折线名称
marker:线条标记
注意:折线图中的颜色和线型、标记可以简化缩写
设置折线图的X轴、Y轴数值范围
面向过程版:
#设置X、Y轴范围
ax1.set_xlim(0,2*np.pi)
ax1.set_ylim(-1,1)
面向对象版:
#设置X、Y轴范围
plt.xlim(0,2*np.pi)
plt.ylim(-1,1)
np.pi:圆周率”π”的意思
设置图例
#设置图例
ax1.legend(loc=0,frameon=False)
location(loc):图例位置,0代表自动取最佳的位置
frameon:是否绘制图例边框
设置坐标轴刻度值
面向过程版:
#坐标轴刻度
ax1.set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
面向对象版:
#坐标轴刻度
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
设置坐标轴名称
面向过程版:
#坐标轴名称
ax1.set_ylabel("y_plot")
面向对象版:
#坐标轴名称
plt.ylabel("y_plot")
修改X轴刻度标签
#刻度标签
ax1_np_pi = [' ', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3\pi}{2}$', r'$2\pi$']
ax1.set_xticklabels(ax1_np_pi)
第一个值为” “,主要是为了隐藏X轴在Y轴交界处的刻度值
设置折线图边框
#边框设置
ax1.spines['bottom'].set_position(('axes',0.5))
ax1.spines['top'].set_color('none')
ax1.spines['right'].set_color('none')
set_position((’axes’),0.5):将X轴往上移动到Y轴的50%,既平分Y轴
set_color(none”):将需要隐藏的边框颜色设置为”None”,就可以实现隐藏效果
添加标记,突出特殊值
#添加标记
#添加标记点
tx = 3*np.pi/4
ty = np.sin(tx)
ax1.scatter(tx,ty,
s=15,
facecolor='b',
zorder=3
)
#添加标记线
ax1.plot([tx,tx],[0,ty],color='lightgray',linestyle=':')
#添加注释
ax1.annotate(r'$y = sin(\frac{3\pi}{4})$',
xy=(tx,ty),xytext=(tx+1,ty),
arrowprops=dict(facecolor='r',
edgecolor='r',
shrink=0.15,
headwidth=10,
headlength=8,
width=2))
标记点参数解释:
tx、ty:标记点的X轴和Y轴坐标点
ax1.scatter:matplotlib绘制散点的语法,下方有散点图绘制部分详细说明,这里不做解释
s:标记点大小
facecolor:标记点颜色
zorder:标记点边框大小
标记线参数解释:
底层逻辑就是通过绘制一条折线来作为标记线,只是这条折线只有(tx,0),(tx,ty)两个点而已,在通过设置线条颜色和线型来美化标记线
注释参数解释:
r'XXXXXXX':注释内容,可自由设置
xy:注释起始位置
xytext:注释文本位置
arrowprops:设置注释参数
折线图标题
下方有标题部分详细说明,这里不做详细解释
#图形标题
ax1.set_title('折线图(plot)',
fontsize='large',
fontweight='light',
fontstyle='oblique',
loc='right')
fontsize:文字大小
fontweight:文字位置
fontstyle:文字风格
loc:标题位置
完整代码
import matplotlib.pyplot as plt
import numpy as np
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(10,5),dpi=60)
ax1 = fig.add_subplot(111)
#折线图
#设置数据
x1 = np.linspace(0,2 * np.pi,100)
y1 = np.linspace(0,10,20)
#绘制图形
ax1.plot(x1,np.sin(x1),color="b",linestyle='--',label='$sin(x)$')
ax1.plot(x1,np.cos(x1),'r-.',label='$cos(x)$')
#设置X、Y轴范围
ax1.set_xlim(0,2*np.pi)
ax1.set_ylim(-1,1)
#设置图例
ax1.legend(loc=0,frameon=False)
#坐标轴刻度
ax1.set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
#坐标轴名称
ax1.set_ylabel("y_plot")
#刻度标签
ax1_np_pi = [' ', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3\pi}{2}$', r'$2\pi$']
ax1.set_xticklabels(ax1_np_pi)
#边框设置
ax1.spines['bottom'].set_position(('axes',0.5))
ax1.spines['top'].set_color('none')
ax1.spines['right'].set_color('none')
#添加标记
#添加标记点
tx = 3*np.pi/4
ty = np.sin(tx)
ax1.scatter(tx,ty,
s=15,
facecolor='b',
zorder=3
)
#添加标记线
ax1.plot([tx,tx],[0,ty],color='lightgray',linestyle=':')
#添加注释
ax1.annotate(r'$y = sin(\frac{3\pi}{4})$',
xy=(tx,ty),xytext=(tx+1,ty),
arrowprops=dict(facecolor='r',
edgecolor='r',
shrink=0.15,
headwidth=10,
headlength=8,
width=2))
#图形标题
ax1.set_title('折线图(plot)',
fontsize='large',
fontweight='light',
fontstyle='oblique',
loc='right')
plt.show()
参考资料:详见文末
散点图
图形绘制特点
图一的气泡图也是散点图的一种,只是通过气泡大小以及不同的颜色来区分散点
图二使用不同的标记(marker)和颜色来区分不同样本的离散程度
图三是典型的散点图绘制
隐藏边框和坐标轴用于美化图形
更换标题颜色主要是突出标题可个性化设置
图形绘制底层原理一致,本篇章主讲气泡图的绘制
生成随机数据
#生成随机数据
x2 = np.random.normal(0,1,100)
y2 = np.random.normal(-2,1,100)
每次执行代码,自动生成不同的气泡图
注意:记得需要导入random模块
import random
设置数据的颜色
#设置不同数据的颜色
colors = abs(np.random.rand(100))
np.random.rand():生成符合正态分布的随机样本值
设置散点的大小
#设置散点的大小随数据而变化
size = 150 * abs(np.random.randn(100))
np.random.randn():生产符合正态分布的随机浮点数
散点图的绘制语法:plt.scatter或ax.scatter
plt.scatter(x,y,size,color,alpha,**kw)
#散点图1
ax2.scatter(x2,y2,s=size,c=colors,alpha=0.7)
s,c皆为size、color的简写
alpha:透明度
隐藏刻度值和刻度标签
面向过程版
#隐藏X轴刻度值和刻度标签
ax2.set_xticks([])
#隐藏Y轴刻度值和刻度标签
ax2.set_yticks([])
面向对象版
#隐藏X轴刻度值和刻度标签
plt.xticks([])
#隐藏Y轴刻度值和刻度标签
plt.yticks([])
隐藏边线
通过for循环隐藏上面、右边、下面、左边的边框
#隐藏边线
for i in ['top', 'right', 'bottom', 'left']:
ax2.spines[i].set_visible(False)
也可以隐藏部分边框,就像这样!
ax2.spines['top'].set_color('none')
ax2.spines['right'].set_color('none')
ax2.spines['bottom'].set_color('none')
ax2.spines['left'].set_color('none')
设置散点图标题
#设置标题
ax2.set_title('散点图(scatter)',
fontsize='x-large',
fontweight='light',
c='r')
fontsize:文本大小
fontweight:文本位置
color:标题颜色
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(8,5),dpi=60)
ax2 = fig.add_subplot(111)
#散点图
#生成随机数据
x2 = np.random.normal(0,1,100)
y2 = np.random.normal(-2,1,100)
#设置不同数据的颜色
colors = abs(np.random.rand(100))
#设置散点的大小随数据而变化
size = 150 * np.random.randn(100)
#散点图1
ax2.scatter(x2,y2,s=size,c=colors,alpha=0.7)
#隐藏X轴刻度值和刻度标签
ax2.set_xticks([])
#隐藏Y轴刻度值和刻度标签
ax2.set_yticks([])
#隐藏边线
for i in ['top', 'right', 'bottom', 'left']:
ax2.spines[i].set_visible(False)
#设置标题
ax2.set_title('散点图(scatter)',
fontsize='x-large',
fontweight='light',
c='r')
plt.show()
参考资料:详见文末
误差图
图形绘制特点
除了美观,也没啥特点了…..(其实也不美观哈哈哈)
误差图的绘制语法:plt.errorbar或ax.errorbar
plt.errorbar(x,y,xerr,yerrr,ecolor,elinewidth,capsize,fmt,ms,mfc,mec,**kw)
ax3.errorbar(range(20),np.random.random(20),
yerr=0.2,
fmt='ok',
ms=7,
ecolor='lightgray',
elinewidth=3,
capsize=5,
capthick=3
)
xerr,yerr:X轴、Y轴误差范围
ecolor:误差线颜色
elinewidth:误差线大小
capsize:误差横杠大小
capthick:误差横杠厚度
fmt:误差点形状
ms:误差点大小
mfc:误差点颜色
mes:误差线边框颜色
设置坐标轴
#设置X轴范围
ax3.set_xlim(-1,21)
#将X轴移动到顶部
ax3.xaxis.set_ticks_position('top')
设置轴刻度值
#设置X轴刻度值
ax3.set_xticks([i for i in range(0,21,4)])
#隐藏Y轴刻度值和刻度标签
ax3.set_yticks([])
隐藏边框
#去掉边框
for i in ['top', 'right', 'bottom', 'left']:
ax3.spines[i].set_color('none')
设置标题
#设置标题
ax3.set_title('误差图(errorbar)')
设置网格
#设置网格
ax3.grid(axis='x',linestyle='-.')
这里只设置了X轴的网格和网格线条类型
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax3 = fig.add_subplot(111)
#误差图
ax3.errorbar(range(20),np.random.random(20),
yerr=0.2,
fmt='ok',
ms=7,
ecolor='lightgray',
elinewidth=3,
capsize=5,
capthick=3
)
#设置X轴范围
ax3.set_xlim(-1,21)
#将X轴移动到顶部
ax3.xaxis.set_ticks_position('top')
#设置X轴刻度值
ax3.set_xticks([i for i in range(0,21,4)])
#隐藏Y轴刻度值和刻度标签
ax3.set_yticks([])
#去掉边框
for i in ['top', 'right', 'bottom', 'left']:
ax3.spines[i].set_color('none')
#设置标题
ax3.set_title('误差图(errorbar)')
#设置网格
ax3.grid(axis='x',linestyle='-.')
plt.show()
参考资料,详见文末
轮廓图
设置X轴Y轴Z轴数据
#设置数据范围
x4 = np.linspace(-10,10,100)
y4 = np.linspace(-10,10,100)
X,Y = np.meshgrid(x4,y4)
Z = np.sin(X) ** 100 + np.cos(10 + Y) + np.sqrt(X**2 + Y**2)
np.linspace():生成等距样本值
绘制轮廓图语法:plt.contour或ax.contour
plt.contour(x,y,z,**kw)
#绘制图形
clabel_ax4 = ax4.contour(X,Y,Z,7)
cc = ax4.imshow(Z,extent=[-10,10,-10,10],origin='lower',alpha=0.5)
ax4.clabel(clabel_ax4,fontsize=8)
7:轮廓线数
extent:轮廓值范围
origin:坐标轴起始位置(默认左上角)
alpha:轮廓图透明度
fontsiZe:
设置刻度值范围
#设置刻度值范围
ax4.set_xticks([i for i in range(-10,11,5)])
ax4.set_yticks([i for i in range(-10,11,5)])
用for循环生成-10~10的等距刻度值
设置标题
#设置标题
ax4.set_title('轮廓图(contour)',
bbox=dict(boxstyle='round,pad=0.5',fc='w',ec='k',lw=1,alpha=0.5))
设置轮廓图颜色条
#设置颜色条
fig.colorbar(colorbar_ax4,ax=ax4)
完整代码
import matplotlib.pyplot as plt
import numpy as np
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax4 = fig.add_subplot(111)
#轮廓图1
#设置数据范围
x4 = np.linspace(-10,10,100)
y4 = np.linspace(-10,10,100)
X,Y = np.meshgrid(x4,y4)
Z = np.sin(X) ** 100 + np.cos(10 + Y) + np.sqrt(X**2 + Y**2)
#绘制图形
clabel_ax4 = ax4.contour(X,Y,Z,7)
cc = ax4.imshow(Z,extent=[-10,10,-10,10],origin='lower',alpha=0.5)
ax4.clabel(clabel_ax4,fontsize=8)
#设置刻度值范围
ax4.set_xticks([i for i in range(-10,11,5)])
ax4.set_yticks([i for i in range(-10,11,5)])
#设置标题
ax4.set_title('轮廓图(contour)',
bbox=dict(boxstyle='round,pad=0.5',fc='w',ec='k',lw=1,alpha=0.5))
#设置颜色条
fig.colorbar(cc,ax=ax4)
plt.show()
参考资料:
matplot画轮廓图_jiuweideqixu的博客-CSDN博客
Python密度和轮廓图绘制–Matplotlib详解_查数菇乐园-CSDN博客_python 轮廓图
matplotlib 合理设置colorbar和子图的对应关系_fzl的博客-CSDN博客
python matplotlib自定义colorbar颜色条-以及matplotlib中的内置色条_留下的,留不下的-CSDN博客
柱形图
图形绘制特点
柱形图从方向区分为分垂直方向和水平方向;从图形区分堆积柱形图和簇状柱形图
本篇文章主要讲述一般常用的簇状柱形图的绘制过程
通过调整边框、刻度标签、图例来美化图形
设置生成随机数据
#设置数据
r = np.random.randint(0,50,8)
x5 = np.array([1,2,3,4])
y5 = np.array([r[0],r[1],r[2],r[3]])
z5 = np.array([r[4],r[5],r[6],r[7]])
ax5_list = ['A','B','C','D']
width = 0.4
r:生成等距样本值
X5:X轴坐标
y5、z5:Y轴坐标
ax5_list:刻度标签
width:柱子宽度
柱形图的绘制语法:plt.bar或ax.bar
plt.bar(x,y,height,width,align,color,edgecolor,**kw)
#簇状柱形图
ax5.bar(x5,y5,width=width,color='r',label='bar1',alpha=0.6)
ax5.bar(x5+width,z5,width=width,color='g',label='bar2',alpha=0.6)
x,y:X轴Y轴坐标
height:柱子高度
width:柱子宽度
color:柱子颜色
edgecolor:柱子边缘颜色
设置柱子显示数值
#设置数据标签
for a,b in zip(x5,y5):
ax5.text(a,b,b,ha='center',va='bottom',fontsize=12)
for a,b in zip(x5+width,z5):
ax5.text(a,b,b,ha='center',va='bottom',fontsize=12)
x5+width:簇状柱形图,去掉width就变成了堆积柱形图(同X轴不同Y轴)
设置轴范围
#设置轴范围
ax5.set_ylim(0,60)
ax5.set_xlim(0,5)
设置刻度范围
#设置刻度范围
t_list = []
for t in range(1,5):
t_list.append(t+width/2)
ax5.set_xticks(t_list)
t+width/2:把刻度值设置在两个柱子中间
ax5.set_xticks:设置X轴范围
设置刻度标签
#设置刻度标签
ax5.set_xticklabels(ax5_list,rotation=40)
rotation=40:旋转40°
设置图形标题
#设置标题
ax5.set_title('簇状柱形图(bar)')
设置图例
#设置图例
ax5.legend()
隐藏部分边框
#隐藏部分边框
ax5.spines['top'].set_color('none')
ax5.spines['right'].set_color('none')
完整代码
import matplotlib.pyplot as plt
import numpy as np
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax5 = fig.add_subplot(111)
#柱形图
#设置数据
x5 = np.array([1,2,3,4])
r = np.random.randint(0,50,8)
y5 = np.array([r[0],r[1],r[2],r[3]])
z5 = np.array([r[4],r[5],r[6],r[7]])
ax5_list = ['A','B','C','D']
width = 0.4
#簇状柱形图
ax5.bar(x5,y5,width=width,color='r',label='bar1',alpha=0.6)
ax5.bar(x5+width,z5,width=width,color='g',label='bar2',alpha=0.6)
#设置数据标签
for a,b in zip(x5,y5):
ax5.text(a,b,b,ha='center',va='bottom',fontsize=12)
for a,b in zip(x5+width,z5):
ax5.text(a,b,b,ha='center',va='bottom',fontsize=12)
#设置数据标签
for a,b in zip(x5,y5):
ax5.text(a,b,b,ha='center',va='bottom',fontsize=12)
for a,b in zip(x5,z5):
ax5.text(a,b,b,ha='center',va='bottom',fontsize=12)
#设置轴范围
ax5.set_ylim(0,60)
ax5.set_xlim(0,5)
#设置刻度范围
t_list = []
for t in range(1,5):
t_list.append(t+width/2)
ax5.set_xticks(t_list)
#设置刻度标签
ax5.set_xticklabels(ax5_list,rotation=40)
#设置标题
ax5.set_title('簇状柱形图(bar)')
plt.show()
参考资料:详见文末
饼图
图形绘制特点
个性化标题
自由设置突出部分饼片
圆环图也是饼图的一种,本篇主讲圆环图的绘制逻辑
饼图的绘制语法:plt.pie或ax.pie
#绘制饼图1
ax6.pie(size,explode=(0,0,0.08,0),
autopct='%1.1f%%',
startangle=90,
wedgeprops={'lw':5,'width':0.3,'edgecolor':'w'})
plt.pie(x,autopct,explode,pctdistance,shadow,startangle,colors,labeldistance,radius,wedgeprops)
x:占比
autopct:格式化百分比
explode:突出显示
pctdistance:离心值
shadow:阴影
startangle:起始角度
colors:饼片颜色
labeldistance:扇形标签与圆心的距离
radius:饼图的半径大小
wedgeprops:饼图的格式
设置数据
设置数据
s = []
for i in range(1,5):
s.append(random.randint(1,100))
s1 = s[0]/sum(s)
s2 = s[1]/sum(s)
s3 = s[2]/sum(s)
s4 = s[3]/sum(s)
size = [s1,s2,s3,s4]
定义标签
定义标签
labels = ['pieA','pieB','pieC','pieD']
设置标签
#设置标题
ax6.set_title('饼图(pie)',
bbox=dict(boxstyle='round,pad=0.5',fc='w',ec='k',lw=1,alpha=0.5))
设置图例
设置图例
ax6.legend(loc=0,ncol=1,labels=labels,frameon=False)
设置等比例轴
设置等比例轴
ax6.axis('equal')
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax6 = fig.add_subplot(111)
饼图
设置数据
s = []
for i in range(1,5):
s.append(random.randint(1,100))
s1 = s[0]/sum(s)
s2 = s[1]/sum(s)
s3 = s[2]/sum(s)
s4 = s[3]/sum(s)
size = [s1,s2,s3,s4]
定义标签
labels = ['pieA','pieB','pieC','pieD']
设置标题
ax6.set_title('饼图(pie)',
bbox=dict(boxstyle='round,pad=0.5',fc='w',ec='k',lw=1,alpha=0.5))
设置图例
ax6.legend(loc=0,ncol=1,labels=labels,frameon=False)
设置等比例轴
ax6.axis('equal')
plt.show()
参考资料:
[python] 基于matplotlib实现圆环图的绘制_You and Me-CSDN博客_matplotlib环形图
Matplotlib饼图注释_超级大洋葱的博客-CSDN博客
面积图
设置数据
设置数据
labels = ['A','B','C','D','E']
a = []
b = []
c = []
d = []
for i in a,b,c,d:
for j in random.choices(range(1,21),k=5):
i.append(j)
if len(d) == 5:
break
data = [a,b,c,d]
x = range(len(labels))
data = np.array(data)
面积图的绘制语法:plt.stackplot或ax.stackplot
plt.stackplot(x,y,baseline,sym,labels,colors)
绘制图形
ax7.stackplot(x,data,baseline='zero',labels=labels,alpha=0.85)
baseline:基线
sym:对称
labels:标签
colors:颜色
设置X轴范围和命名
设置X轴
ax7.set_xlim(0,4)
ax7.set_xticks(x)
设置图例
设置图例
ax7.legend()
设置标题
设置标题
ax7.set_title('面积图')
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax7 = fig.add_subplot(111)
面积图
设置数据
labels = ['A','B','C','D','E']
a = []
b = []
c = []
d = []
for i in a,b,c,d:
for j in random.choices(range(1,21),k=5):
i.append(j)
if len(d) == 5:
break
data = [a,b,c,d]
x = range(len(labels))
data = np.array(data)
绘制图形
ax7.stackplot(x,data,baseline='zero',labels=labels,alpha=0.85)
设置X轴
ax7.set_xlim(0,4)
ax7.set_xticks(x)
设置图例
ax7.legend()
设置标题
ax7.set_title('面积图')
plt.show()
参考资料:
matplotlib之pyplot模块——堆积面积图、主题河流图(stackplot)_mighty13的专栏-CSDN博客
直方图
图形绘制特点:
三个直方图分别使用随机样本值生成(指定了范围)
降低透明度,随机重叠部分区域,突出样本值分布范围
隐藏Y轴和部分边框,美化图形
直方图的绘制语法:plt.hist或ax.hist
plt.hist(x,bins,density,alpha,histtype,color,rwidth,orientaition)
绘制图形
ax8.hist(np.random.normal(0,1,100),
bins=30,
density=True,
alpha=0.4,
histtype='stepfilled',
label='$hist1$'
)
ax8.hist(np.random.normal(-2,1,100),
bins=30,
density=True,
alpha=0.4,
histtype='stepfilled',
label='$hist2$'
)
ax8.hist(np.random.normal(3,1,100),
bins=30,
density=True,
alpha=0.4,
histtype='stepfilled',
label='$hist3$'
)
np.random.nornal():在一个样本区间范围内指定生成个数
bines:柱子数量
density:概率总和为1
alpha:透明度
histtype:直方图风格
label:直方图名称
设置刻度范围
面对过程版
#设置刻度范围
ax8.set_xticks([-4,-2,0,2,4])
ax8.set_yticks([])
面对对象版
#设置刻度范围
plt.xticks([-4,-2,0,2,4])
plt.yticks([])
ax8.set_yicks([]):隐藏Y轴刻度
设置刻度标签
#设置刻度标签
ax8_list = ['A','B','C','D','E']
ax8.set_xticklabels(ax8_list)
ax8.legend(loc=1,frameon=False)
for i in ['top','left','right']:
ax8.spines[i].set_visible(False)
location(loc):图例位置,0代表自动取最佳的位置
frameon:是否绘制图例边框
spines[].set_visible:隐藏部分边框
设置标题
#设置标题
ax8.set_title('直方图(hist)')
完成代码
import matplotlib.pyplot as plt
import numpy as np
import random
#中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
#设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax8 = fig.add_subplot(111)
直方图
绘制图形
ax8.hist(np.random.normal(0,1,100),
bins=30,
density=True,
alpha=0.4,
histtype='stepfilled',
label='$hist1$'
)
ax8.hist(np.random.normal(-2,1,100),
bins=30,
density=True,
alpha=0.4,
histtype='stepfilled',
label='$hist2$'
)
ax8.hist(np.random.normal(3,1,100),
bins=30,
density=True,
alpha=0.4,
histtype='stepfilled',
label='$hist3$'
)
#设置刻度范围
ax8.set_xticks([-4,-2,0,2,4])
ax8.set_yticks([])
#设置刻度标签
ax8_list = ['A','B','C','D','E']
ax8.set_xticklabels(ax8_list)
ax8.legend(loc=1,frameon=False)
for i in ['top','left','right']:
ax8.spines[i].set_visible(False)
#设置标题
ax8.set_title('直方图(hist)')
plt.show()
雷达图
图形绘制特点:
多个雷达图堆叠在一起,以此对比不同对象的各项属性
利用不同的透明度美化图形的填充颜色和边缘颜色
图例的边框增加阴影突出立体感
隐藏图形边框
隐藏边框
ax9.set_axis_off()
plt.axis(‘off’):隐藏所有刻度线和标签
设置数据源
设置随机数据源
a = []
b = []
c = []
for i in a,b,c:
for j in random.choices(range(1,6),k=5):
i.append(j)
if len(c) == 5:
break
用for循环为abc三个列表各随机生成五个数
random.choices(range(1,6),k=5):随机在[1,6)中选取一个数,共选取5次
设置极轴刻度标签
极轴刻度
labels = ['var1','var2','var3','var4','var5']
轴径
轴径
N = len(a)
设置雷达图的角度值
设置雷达图的角度值
angles = np.linspace(0,2*np.pi,N,endpoint=False)
np.linspace(0,2*np.pi,N):在(0,2π)范围内随机生成N个数(浮点数)
endpoint:是否等距
闭环
封闭雷达图
a = np.concatenate((a,[a[0]]))
b = np.concatenate((b,[b[0]]))
c = np.concatenate((c,[c[0]]))
angles = np.concatenate((angles,[angles[0]]))
labels = np.concatenate((labels,[labels[0]]))
将abc三个对象的数据闭环
将雷达图和刻度标签形成闭环
坐标转换格式
设置为极坐标格式
ax9 = fig.add_subplot(111,polar=True)
不转换格式,雷达图将以默认坐标格式显示
绘制abc三个对象的线条
绘制折线图
ax9.plot(angles,a,lw=1,linestyle='solid',label='A')
ax9.plot(angles,b,lw=1,linestyle='solid',label='B')
ax9.plot(angles,c,lw=1,linestyle='solid',label='C')
lw:线宽
linestyle:线条风格
label:线条名称
填充abc三个对象的颜色
填充颜色
ax9.fill(angles,a,color='b',alpha=0.1)
ax9.fill(angles,b,color='r',alpha=0.1)
ax9.fill(angles,c,color='g',alpha=0.1)
添加极轴标签
添加极轴标签
ax9.set_thetagrids(angles*180/np.pi,labels)
设置极轴范围
设置极轴范围
ax9.set_ylim(0,5)
设置极轴开始点
设置极轴开始点
ax9.set_theta_zero_location('N')
设置极轴方向
设置极轴方向
ax9.set_theta_direction(-1) #顺时针:1 逆时针:-1
设置网格线
设置网格线
ax9.grid(True)
设置图例
设置图例
ax9.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), shadow=True, ncol=3)
loc:图例位置
bbox_to_anchor:边框设置
shadow:阴影
ncol:图例列数
设置标题
设置标题
ax9.set_title('雷达图')
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax9 = fig.add_subplot(111)
雷达图
隐藏边框
ax9.set_axis_off()
设置随机数据源
a = []
b = []
c = []
for i in a,b,c:
for j in random.choices(range(1,6),k=5):
i.append(j)
if len(c) == 5:
break
极轴刻度标签
labels = ['var1','var2','var3','var4','var5']
labels.append(labels[0]) #要么这里闭合,要么下面闭合
轴径
N = len(a)
设置雷达图的角度值
angles = np.linspace(0,2*np.pi,N,endpoint=False)
封闭雷达图
a = np.concatenate((a,[a[0]]))
b = np.concatenate((b,[b[0]]))
c = np.concatenate((c,[c[0]]))
angles = np.concatenate((angles,[angles[0]]))
labels = np.concatenate((labels,[labels[0]])) #要么这里闭合,要么上面闭合
设置为极坐标格式
ax9 = fig.add_subplot(111,polar=True)
绘制折线图
ax9.plot(angles,a,lw=1,linestyle='solid',label='A')
ax9.plot(angles,b,lw=1,linestyle='solid',label='B')
ax9.plot(angles,c,lw=1,linestyle='solid',label='C')
填充颜色
ax9.fill(angles,a,color='b',alpha=0.1)
ax9.fill(angles,b,color='r',alpha=0.1)
ax9.fill(angles,c,color='g',alpha=0.1)
添加极轴标签
ax9.set_thetagrids(angles*180/np.pi,labels)
设置极轴范围
ax9.set_ylim(0,5)
设置极轴开始点
ax9.set_theta_zero_location('N')
设置极轴方向
ax9.set_theta_direction(-1) #顺时针:1 逆时针:-1
设置网格线
ax9.grid(True)
设置图例
ax9.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), shadow=True, ncol=3)
设置标题
ax9.set_title('雷达图')
plt.show()
参考资料:详见文末
热力图
设置数据源
设置数据源
x10 = np.random.rand(4,4)
绘制图形
绘制图形
colorbar_10 = ax10.imshow(x10, cmap=plt.cm.hot, vmin=0, vmax=1)
fig.colorbar(colorbar_10,ax=ax10,extend='both')
imshow:显示图像
cmap:色彩
vmin、vmax:颜色最值范围
extend:色彩颜色
ax:图像位置
设置标题
设置标题
ax10.set_title('热力图')
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax10 = fig.add_subplot(111)
热力图
设置数据源
x10 = np.random.rand(4,4)
绘制图形
colorbar_10 = ax10.imshow(x10,cmap=plt.cm.hot,vmin=0,vmax=1)
fig.colorbar(colorbar_10,ax=ax10,extend='both')
设置标题
ax10.set_title('热力图')
plt.tight_layout()
plt.show()
参考资料:
一、python可视化——热力图_Nicole的博客-CSDN博客_python 热力图
词云图
图像绘制特点:
大部分教程都是使用导入本地文件的方法来运行,这可能不太适合刚接触的同学,所以我直接设置词组来展示词云图的效果
设置词组
设置词组(歌曲:我怀念的)
text = '我怀念的是无言感动,我怀念的是绝对炽热,我怀念的是你很激动求我原谅抱得我都痛'
分词
使用全模式分词
tp = jieba.cut(text,cut_all=True)
记得导入jieba库
import jieba # 安装库:pip install jieba
如果你的文本有很多空格或者标点符号,则需要先做数据清洗,具体例子参考百度
合并词组
合并词组
tp = ','.join(tp)
分词后,需要用一个符号来重新合并文本,否则会报错显示只有一个词组
jion():python内置合并函数
生成词云
生成云词
wc = WordCloud(font_path=r'.\simhei.ttf',background_color='white').generate(tp)
font_path:字体位置(请翻到最上面重新看字体部分)
background_color:背景颜色
注意语法的大小写
记得导入相关库
from wordcloud import WordCloud
这个库的安装比较容易失败,建议百度查询安装方式
隐藏边框和刻度
隐藏所有边框和刻度
ax11.axis('off')
显示图像
显示图像
ax11.imshow(wc)
设置标题
设置标题
ax11.set_title('词云图')
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
import logging
import jieba
from wordcloud import WordCloud
中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax11 = fig.add_subplot(111)
词云图
jieba.setLogLevel(logging.INFO)
设置词组(歌曲:我怀念的)
text = '我怀念的是无言感动,我怀念的是绝对炽热,我怀念的是你很激动求我原谅抱得我都痛'
使用全模式分词
tp = jieba.cut(text,cut_all=True)
合并词组
tp = ','.join(tp)
生成云词
wc = WordCloud(font_path=r'.\simhei.ttf',background_color='white').generate(tp)
隐藏所有边框和刻度
ax11.axis('off')
显示图像
ax11.imshow(wc)
设置标题
ax11.set_title('词云图')
plt.tight_layout()
plt.show()
参考资料:
python :jieba库的使用大全_总裁余(余登武)博客-CSDN博客_pythonjieba库的使用
【学习笔记】wordCloud的基本使用_寸先生的AI道路-CSDN博客
详细介绍使用wordCloud设计词云_修炼之路-CSDN博客
怎么用Python画出好看的词云图?_数据森麟-CSDN博客
箱型图
图像绘制特点
利用三个不同的样式作为设置对比,可以自由设置箱型图的宽度、误差线、颜色、中位线等等
设置数据
设置数据
data =[np.random.normal(0,i,100) for i in range(1,4)]
随机生成三个样本
np.random.normal():随机生成正态分布
绘制图形
绘制图形
boxs = ax12.boxplot(data,patch_artist=True,
vert=True,widths=[0.2,0.4,0.3])
箱型图的绘制语法:plt.boxplot或ax.boxplot
plt.boxplot(data,patch_artist,vert,widths,sym)
data:数据
pathc_artist:填充箱体颜色
vert:箱体显示方向;True垂直摆放,False水平摆放
widths:箱体宽度
sym:指定异常点的形状
设置颜色
设置颜色
colors = ['pink', 'lightblue', 'lightgreen']
for patch,color in zip(boxs['boxes'],colors):
patch.set_facecolor(color)
zip:python内置函数
boxs[‘boxes’]:箱体在箱型图中国的位置
设置刻度值
设置刻度值
ax12.set_yticks([-6,-3,0,3,6])
设置标题
设置标题
ax12.set_title('箱型图')
完整代码
import matplotlib.pyplot as plt
import numpy as np
import random
中文设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 用于解决保存图像是负号'-'显示为方框的问题
设置画布
fig = plt.figure(figsize=(8,5),dpi=120)
ax12 = fig.add_subplot(111)
箱型图
设置数据
data =[np.random.normal(0,i,100) for i in range(1,4)]
绘制图形
boxs = ax12.boxplot(data,patch_artist=True,
vert=True,widths=[0.2,0.4,0.3])
设置颜色
colors = ['pink', 'lightblue', 'lightgreen']
for patch,color in zip(boxs['boxes'],colors):
patch.set_facecolor(color)
设置刻度值
ax12.set_yticks([-6,-3,0,3,6])
设置标题
ax12.set_title('箱型图')
plt.tight_layout()
plt.show()
参考资料:
Matplotlib – 箱线图、箱型图 boxplot () 所有用法详解_Not Found黄小包-CSDN博客_matplotlib箱线图
图形设置常用参数
以下主要记录图形参数的一些常用设置
注释
plt.annotate(t,xy,xytext,arrowprops,color,weight,bbox) t注释内容xytext注释位置xy注释的坐标点color注释颜色weight字体线性bbox注释框arrowprops绘制箭头 arrowprops子参数 headwidth箭头大小width箭头线大小facecolor箭头颜色edgecolor箭头边框颜色shrink箭头线收缩长度
文本
plt.text(x,y,family,fontsize,style,color) x,y注释内容位置family字体fontsize字体大小style字体风格color字体颜色
参考资料:
Python绘图总结(Matplotlib篇)之字体、文本及注释_wuzlun的专栏-CSDN博客_matplotlib 字体
Matplotlib注释箭头样式_超级大洋葱的博客-CSDN博客
matplotlib命令与格式:标题(title),标注(annotate),文字说明(text)_开码河粉-CSDN博客_plt设置title
图像
plt.imshow(x,cmap,extent,origin,alpha,interpolation,aspect) xcmap图像色彩extent坐标轴范围origin图像原点位置alpha透明度interpolation显示方式aspect控制轴的纵横比
参考资料:
Matplotlib imshow()函数_叫我SKY的博客-CSDN博客
matplotlib基础绘图命令之imshow_庐州月光的博客-CSDN博客
颜色条
plt.colorbar(ax,norm,cmap,orientation,extend) ax颜色条的位置norm颜色条的大小值cmap色彩orientationorientationextendextend
参考资料:
python matplotlib自定义colorbar颜色条-以及matplotlib中的内置色条_留下的,留不下的-CSDN博客
图形窗口管理
图形窗口常用语法 plt.axes([左边,底部,宽度,高度])设置子图表大小plt.subplot创建单个子图表plt.subplots快速创建多个子图表plt.GridSpec自定义排列subplots_adjust自定义设置图像间距plt.tight_layout自动调整图像间距 plt.subplots常用参数 nrows行数ncols列数num画布名称facecolor画布背景颜色edgecolor画布边框颜色frameon是否绘制画布图框figsize图像大小sharex相同X轴刻度sharey相同Y轴刻度 subplots_adjust left左边bottom底部right右边top顶部wspace左右宽度hspace上下宽度
参考资料:
标题
plt.title常用参数 fontsize字体大小fontweight字体粗细fontstyle字体类型location字体位置rotation字体旋转alpha透明度backgroundcolor标题背景color标题颜色bbox标题外框
fontsize子参数 xx-small最小x-small较小small小medium中等large大x-large较大xx-large最大 fontweight子参数 light细的normal正常medium中等semibold较粗 fontstyle子参数 normal正常italic斜体oblique倾斜 location子参数 verticalalignment水平对齐;center、top、bottom、baselinhorizontalalignment垂直对齐;left、right、center bbox标题外框子参数 boxstyle方框外形facecolor背景颜色edgecolor边框线条颜色edgewidth边框线条大小
参考资料:
matplotlib命令与格式:标题(title),标注(annotate),文字说明(text)_开码河粉-CSDN博客_plt设置title
坐标轴
坐标轴常用参数 plt.xlim;ax.set_xlimX轴坐标plt.ylim;ax.set_ylimY轴坐标plt.axis坐标轴特殊设置plt.xlabelX轴名称plt.ylabelY轴名称twinx双坐标轴
plt.axis子参数 plt.axis(”tight”)自动设置X、Y轴最值plt.axis(”equal”)自动设置X、Y轴相同范围plt.axis(”off”)隐藏所有刻度线和标签
刻度
刻度值 plt.xticks;ax.set_xticksX轴刻度值plt.yticks;ax.set_yticksY轴刻度值plt.xticks([]);ax.set_xticks([])隐藏X轴刻度值和标签plt.yticks([]);ax.set_yticks([])隐藏Y轴刻度值和标签plt.tick_params(bottom=False,top=False,left=False,right=False)隐藏刻度值r’\frac{分子}{分母}’显示分数的方法 刻度标签 xticklabelsX轴刻度标签yticklabelsY轴刻度标签
参考资料:
matplotlib隐藏刻度线、标签和边线_韭浪的博客-CSDN博客_matplotlib 隐藏刻度
边框
ax.spines常用设置 ax.spines[”].set_color(‘none’)隐藏部分边线ax.spines[].visible隐藏部分边线for i in [‘top’, ‘right’, ‘bottom’, ‘left’]:
ax.spines[i].set_visible(False)隐藏全部边线ax.xaxis.set_ticks_position(”)调整X轴位置ax.yaxis.set_ticks_position(”)调整Y轴位置 边线位置 top顶部bottom底部left左边right右边
参考资料:
matplotlib 的 spines模块详解_Python草堂的博客-CSDN博客_spines
网格
plt.grid常用参数 alpha透明度color颜色linewidth网格线宽度linestyle网格线分割which线条层次;major、minor、both三个参数可选axis网格轴;x、y、both三个参数可选
图例
plt.legend常用参数 location(loc)图例位置angle阴影的角度density阴影线的密度byt图例边框;o(显示)n(不显示)frameon图例边框;True、Falsebg
图例背景色
cex字符大小ncol图例列数 图例框常用设置 boxlty图例框的类型boxlwd图例框线条粗细 图例标题常用设置 title图例标题
title.col
图例标题颜色title.adj图例标题位置
图例中的文本可设置字体大小、文本字体、文本颜色、文本宽度,和标题、注释一样
参考资料:
python – matplotlib.legend()函数用法解析_鸡啄米的时光机的博客-CSDN博客
线条
线条常用设置参数 linestyle线条风格marker线条标记linewidth(lw)线条粗细 linestyle常用参数 -实线–虚线-.长短点虚线:点线
参考资料:
python+matplotlib绘图线条类型和颜色选择_syyyy712的博客-CSDN博客_matplotlib 颜色
填充
fill设置 fill填充区域fill_beween填充交叉区域
fill属性用得少,各位可以看下参考资料,讲的也比较详细(主要是懒!!!)
参考资料:
Matplotlib中的fill_between总结_kabuto_hui的博客-CSDN博客
Matplotlib:fill, fill_between ,fill_betweenx填充图形指定区域_错位的梦寐的博客-CSDN博客_matplotlib区域填充
matplotlib笔记脑图
注意事项:
- 部分参数可以使用简写
- 气泡图本质上也是散点图的一种
- 误差图的原理是在图形上增加误差线而已,本质上柱状图、直方图、箱型图等等也是可以通过增加误差线参数来实现添加误差线
- 环形图的原理就是在饼图中间再画一个背景色的饼图来隐藏中间
- 用折线图+填充(fill)也可以实现面积图的效果
- 柱形图和直方图的区别就在于看的是数据的具体数值还是分布趋势
- 雷达图本质上是把坐标换成极坐标的折线图+填充
matplotlib全图参考资料:
(认真看完,再针对不懂的点单独查询,多加练习也就学会这玩意了)
推荐收藏 | 最强(全) Matplotlib 可视化实操指南
Python–Matplotlib(基本用法)_苦作舟的人呐-CSDN博客_matplotlib
Matplotlib全面语法教程 & 更好的理解Matplotlib用法 – 知乎
[Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解_杨秀璋的专栏-CSDN博客_python聚类分析
尾语
写这篇文章的主要目的是为了记录自己所学的知识,同时,也为了给刚接触matplotlib的朋友一点参考价值。
文中有很多参考资料,都是很多大佬们写的一些资料,讲的也比较详细
最后感谢各位的观看,觉得可以的话可以点赞收藏喔
示例图代码
详见网址:matplotlib二维练习图纸代码.py-Python文档类资源-CSDN下载
Original: https://blog.csdn.net/weixin_46159679/article/details/120916533
Author: inganxu
Title: 【matplotlib】浅谈python图形可视化练习经验分享
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/766627/
转载文章受原作者版权保护。转载请注明原作者出处!