Matplotlib数据可视化
2021-08-08 22:21:37 1 举报
AI智能生成
Python数据分析三剑客-Matplotlib思维导图
作者其他创作
大纲/内容
5. 常用视图
折线图
如果plot()只给一个参数,那就是Y轴的值,X轴默认0~N
一图多线:plt.plot(x)
plt.plot(x.cumsum())
多图布局:fig, axs = plt.subplots(2,1)
fig.set_figwidth(9)此处只能用set来设置
axs[0].plot(x)
柱状图
堆叠柱状图
plt.bar(x,y2,bottom = y1, color='red', width=0.5, yerr = 4, ecolor = 'green', capsize = 5, tick_label=[ ]),其中bottom是把y2画到y1上面,width为线宽,yerr为误差条,ecolor为误差条颜色,capsize为误差条上下线长度,ticklabel为坐标标签
分组带标签柱状图
plt.bar(x-width/2, y1, width)
plt.bar(x+width/2, y2, width),将x坐标分别向左向右移width/2
注释:for i,bar in enumerate(bars):
h = bar.get_height()
w = bar.get_width()
plt.text(x = bar.get_x() + w/2 ,
y = h + 0.5,s = y2[i],ha = 'center')
条形图
plt.barh()
极坐标图
极坐标线形图
ax = plt.subplot(111,projection='polar'),其中projection即为定义极坐标,或者写成polar = True
ax.plot(x,y)
ax.set_rmax(3),设置半径最大值
ax.set_rticks([0,1.5,3]),设置半径刻度
ax.set_rlabel_position(-45),设置半径刻度位置,其中-45为度数
极坐标柱状图
ax.bar(x,y,color = colors),其中colors可以随机生成颜色colors=np.random.rand(8,3)
直方图
count, bins,fig = plt.hist(x,bins=100,density=True),画直方图会返回三个参数:count次数,bins区间,fig图形。其中density为概率
箱形图
plt.boxplot(x, notch = True, sym = 'ro', vert=False),其中notch为中位线,sym为异常值颜色形状,vert为垂直方向
散点图
x = np.random.randn(100,2)
plt.scatter(x[:,0], x[:,1], c = np.random.rand(100,3), s = np.random.randint(100,300,size = 100)),其中x[:,0]为横坐标,也就是一个变量,x[:,1]为纵坐标,就是另一个变量,c为颜色,s为尺寸。
点中点效果:画两个scatter,s不同
饼图
一般饼图
plt.pie(x, labels= [], textprops={'family':'Songti SC','fontsize':18}, autopct='%0.2f%%', explode=[0,0,0,0,0,15], shadow=True),其中textprops为字体设置,autopct为显示百分比,explode为突出某一部分,shadow为阴影
嵌套饼图
假设p1为外圈,p2为内圈。plt.pie(p1, radius=1, pctdistance=0.85, wedgeprops={'linewidth':5, 'width':0.3, 'edgecolor':'white'})
plt.tie(p2, radius=0.7, pctdistance=0.55,wedgeprops={'linewidth':5, 'width':0.7, 'edgecolor':'white'}),其中pctdistance为百分比位置,wedgeprops为饼图格式
热力图
plt.imshow(x,cmap=plt.cm.RdBu_r),其中cmap为颜色
添加文本:
for i in range(7):
for j in range(7):
plt.text(x = j,y = i,s=round(data[i,j],1),ha = 'center')
如果行和列差太多导致不美观,可以将列进行复制:
data = np.repeat(nd,4,axis = 1) # 列进行了复制4份,绘制图形美观。
那么文本代码为:
h,w = data.shape # h = 13,w = 16(4*4)
for x in range(w):
for y in range(h):
if (x%4 == 0) and (~np.isnan(data[y,x])):
plt.text(x+1.5,y,data[y,x],ha = 'center',va = 'center')
绘制颜色条:plt.colorbar(shrink=0.85)
面积图
plt.stackplot(x1,x2,x3,x4,x5)
蜘蛛图
labels = np.array(['个人能力','IQ','EQ','团队意识','持续学习','解决问题能力'])
angles = np.arange(0,2*np.pi,np.pi/3) # 弧度
stats = np.random.randint(50,120,size = 6) # 个人能力强弱
# 首尾相连,和原来相比,长度增加了一个
angles = np.concatenate([angles,angles[[0]]])
stats = np.concatenate([stats,stats[[0]]])
axes = plt.subplot(111,polar = True) # 极坐标图
axes.plot(angles,stats,marker = 'o',lw = 2) # 折线图
axes.fill(angles,stats,alpha = 0.2)
axes.set_thetagrids(angles[:-1]*180/np.pi,labels=labels,fontsize = 18) # 设置了角度显示
_ = axes.set_rgrids([10,30,50,70,90,110])
6. 3D图形
导入库:from mpl_toolkits.mplot3d.axes3d import Axes3D
三维折线图
fig为二维视图,ax3 = Axes3D(fig), ax3.plot(x,y,z)
三维散点图
ax3.scatter(np.random.rand(50)*20,
np.random.rand(50),
np.random.rand(50),s = 100,color = 'green')
三维柱状图
ax3 = Axes3D(fig)
for s in season:
ax3.bar(np.arange(1,4),# 一个季度:三个月。横坐标
np.random.randint(50,100,size = 3),# 高度,销量,纵坐标
zs = s, # 偏移量
zdir = 'x',# 排列方向
alpha = 0.5)
0. 导入库
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
import numpy as np
import matplotlib.pyplot as plt
1. 基础知识
设置中文字体
1. 获取电脑上的字体库
from matplotlib.font_manager import FontManager
fm = FontManager()
[font.name for font in fm.ttflist]
2. 全局修改中文字体
plt.rcParams['font.sans-serif'] = 'Songti SC' # 设置宋体,显示中⽂
图形绘制
图像尺寸:plt.figure(figsize=(9,6),linewidth=4),其中linewidth为边界宽度
绘制线形图:plt.plot(x,y),也可直接画多个图plt.plot(x1,y1,x2,y2)
网格线:plt.grid(linestyle='--', color='red',alpha=0.5, axis = 'x'),其中linestyle为样式,color为颜色,alpha为透明度,axis为x轴的网格
去掉边框:plt.box(False)
坐标轴
坐标轴范围
plt.axis([-1,10,-1.5,1.5])
plt.xlim([-1,10])
plt.ylim([-1.5,1.5])
坐标轴刻度
plt.xticks(ticks = np.arange(0,7,np.pi/2),
labels = ['0',r'$\frac{\pi}{2}$',r'$\pi$',r'$\frac{3\pi}{2}$',r'$2\pi$'],fontsize = 20,fontweight = 'normal',color = 'red')
plt.yticks(ticks = [-1,0,1],labels=['min',' 0 ','max'],fontsize = 20,ha= 'right')
其中ticks为轴刻度,labels为轴刻度标签,fontsize为字体大小,fontweight为字体粗细,ha为水平对齐方式
plt.tick_params(labelsize=18, rotation =60)
字符串:[str(i) + 'K' for i in np.arange(0,161,step = 20)]
坐标轴标题
plt.ylabel('y=sin(x)',rotation=0),其中rotation为旋转角度
图形标题
设置字体属性:font={'family':'serif','style':'italic','weight':'normal','color':'red','size':16,'backgroundcolor':'#c5b783'}
plt.title('正弦波', fontdict=font, pad=30),通过字典修改属性,其中pad为间隔
超标题:plt.suptitle(' ', y=1.05)
图例
plt.legend(['Sin','Cos'], loc ='center',ncol=2,bbox_to_anchor=[0,1.05,1,0.2]),其中loc为位置,ncol为列数,bbox_to_anchor为指定相对位置(x,y,width,height)
脊柱移动
1. 先画一个图,然后获取当前视图:ax = plt.gca()
2. 右边和上面的脊柱消失:ax.spines['right'].set_color('white')
ax.spines['top'].set_color('#FFFFFF')
3. 设置下面左边脊柱位置:ax.spines['left'].set_position(('data',0)),其中data表示数据,如果改为axes,则表示相对位置0~1
图片保存
分支主题
背景颜色
获取视图,然后ax.set_facecolor('lightgreen')
自动调整布局:plt.tight_layout()
保存:plt.savefig('./image.png', dpi=100, facecolor='violet', edgecolor='lightgreen', bbox_inches='tight'),其中文件类型可支持png/jpg/pdf,dpi为像素,越大越清楚,facecolor为视图与边界之间的颜色,edgecolor为视图边界颜色,bbox_inches保存图片完整
16进制颜色网站
https://www.cnblogs.com/doudou618/p/4455585.html
2. 风格和样式
plt.plot(x,y,color='red',ls='-.',marker='*',markersize=20,markerfacecolor='red', markeredgecolor='green', markeredgewidth=3, linewidth=3,alpha=0.3),其中color为颜色,也可以用十六进制或者(r,g,b)来表示,ls为样式,marker为点型,markersize为点大小,markerfacecolor为点颜色,markeredgecolor为点边缘颜色,markeredgewidth为点边缘宽度,linewidth为线宽
3. 多图布局
子视图
1. 两行两列第一个子视图:ax = plt.subplot(2,2,1),也可以plt.subplot(221)
2. 画子视图:ax.plot(x,y)
3. 设置子视图整体属性:ax.set_facecolor='green')
嵌套
方式一:ax= plt.axes([0.2,0.55,0.3,0.3]),ax.plot(x,y),参数含义[left,bottom,width,height],0表示左下角,1表示右上角
方式二:先创建视图fig=plt.figure(figsize=(9,6)),然后ax=fig.add_axes([0.55,0.2,0.3,0.3]),ax.plot(x,y)
分格显示均匀分布
fig, ((ax11,ax12,ax13),(ax21,ax22,ax23),(ax31,ax32,ax33)) = plt.subplots(3,3),此方法返回两个参数:figure和子视图,然后ax11.plot(x,y)就可以绘制。也可以通过plt.subplot()来添加子视图
不均匀分布
1. 需要导入gridspec模块:import matplotlib.gridspec as gridspec
2. 将整个视图分成3x3布局:gs = gridspec.GridSpec(3,3)
3. 使用切片方式设置子视图:ax1=fig.add_subplot(gs[0,:],表示第一行,3列
4. ax2 = plt.subplot(gs[1,:2]),表示第二行,2列
双轴显示
ax1 = plt.gca()
ax2 = ax1.twinx(),共享x轴
4. 文本、注释、箭头
文本
plt.text(x,y,s=r'$\cos(2 \pi t) \exp(-t)$'),其中x,y为横纵坐标位置,s为文本内容
箭头
data = np.random.randint(0,10,size = (10,2))
plt.scatter(x = data[:,0],y = data[:,1],color = 'green',marker = '*',s = 100)
for i in range(9):
start = data[i] # 起始
end = data[i + 1] # 终点
plt.arrow(x = start[0],y = start[1], # 起点坐标
dx = end[0] - start[0],dy = end[1] - start[1],#水平和竖直举例
lw = 2,# 线宽
head_width = 0.2,# 箭头宽度
length_includes_head = True)# 长度计算包含箭头长度)
plt.text(start[0],start[1],i,fontsize = 18,color = 'red')
if i == 8:
plt.text(end[0],end[1],i + 1,fontsize = 18,color = 'red')
注释
ax.annotate('local max', xy=(2,1), xytext=(3,1.5), arrowprops=dict(facecolor='black', shrink=0.05, width=2, headwidth=10, arrowstyle='-|>', connectionstyle='arc,angleA=0, angleB=150')),其中xy为箭头指向位置,xytext为文本位置,arrowprops为箭头设置,width为箭头宽度,headwidth为箭头头部宽度,shrink为箭头两端收缩比,arrowstyle为箭头样式,connectionstyle为连接方式,可以网上查到
0 条评论
下一页