【python数据分析(23)】Matplotlib库绘图的子图、主次刻度、注解、图表输出

1、 子图

1)在matplotlib中,整个图像为一个Figure对象;

2)在Figure对象中可以包含一个或者多个Axes对象;

3)每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域

1.1 plt.figure绘制子图

1)直接通过num参数绘制子图

plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None,
frameon=True, FigureClass=<class ‘matplotlib.figure.Figure’>, **kwargs)

常使用的是前五个参数:
num=None 第几个图像
figsize=None 图像的大小
dpi=None 图像的清晰度
facecolor=None 前景色设置
edgecolor=None 边缘色设置

fig1 = plt.figure(num=1,figsize=(4,2))
plt.plot(np.random.rand(50).cumsum(),'k--')
fig2 = plt.figure(num=2,figsize=(4,2))
plt.plot(50-np.random.rand(50).cumsum(),'k--')

–> 输出的结果为:(当我们调用plot时,如果设置plt.figure(),则会自动调用figure()生成一个figure, 严格的讲,是生成subplots(111),注意这里有s的,之后的内容会将到这个subplots
在这里插入图片描述
2)先建立子图然后填充图表

fig = plt.figure(figsize=(10,3),facecolor = 'gray')

ax1 = fig.add_subplot(1,2,1)  # 第一行的左图
plt.plot(np.random.rand(50).cumsum(),'k--')
plt.plot(np.random.randn(50).cumsum(),'b--')

ax2 = fig.add_subplot(1,2,2)  # 第一行的右图
ax2.hist(np.random.rand(50),alpha=0.5,edgecolor = 'k')

–> 输出的结果为:(注意这里的方法是fig.add_subplot(),后面是没有s的,要和下面要介绍的方法区别开,这个add_subplot()是需要创建一个大画布对象之后再添加子图)
在这里插入图片描述

1.2 plt.subplots绘制子图

plt.subplots()创建一个新的figure,并返回一个subplot对象的numpy数组

fig,axes = plt.subplots(2,2,figsize=(10,4))
ts = pd.Series(np.random.randn(1000).cumsum())
print(axes, axes.shape, type(axes))

–> 输出的结果为:(生成图表对象的数组,默认是只有画布的,没有图像)
在这里插入图片描述
1) 通过数组指定绘制子图的位置

ax1 = axes[0,0]
ax2 = axes[1,0]
ax1.plot(ts)
ax2.plot(ts,color='g')

–> 输出的结果为:(注意上面的axes.shape的输出,被命名的绘制子图数组的范围应该在这个输出的范围之内)
在这里插入图片描述
2) 通过plot()括号内的ax参数子图设置

ts.plot(ax = axes[0,1], color = 'k')
ts.plot(ax = axes[1,1], color = 'y')

–> 输出的结果为:(这两行代码是和上面一个cell中的,由于使用的随机数,所以最后的图形是不一样的,注意这两个绘图的区别)
在这里插入图片描述

1.3 子图参数调整

使用上面的方式可以创建子图,那么对子图进行调整的话,就需要进一步设置代码了,常使用的就是下面的四个参数

sharex,sharey:是否共享x,y刻度
wspace,hspace:用于控制宽度和高度的百分比,比如subplot之间的间距

fig,axes = plt.subplots(2,2,sharex=True,sharey=True)

for i in range(2):
    for j in range(2):
        axes[i,j].hist(np.random.randn(500),color='k',alpha=0.5,edgecolor = 'k')
plt.subplots_adjust(wspace=0,hspace=0)

–> 输出的结果为:
在这里插入图片描述

1.4 多系列图,分别绘制

这种就是根据创建的DataFramecolumns中的元素进行绘制

df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
df = df.cumsum()
df.plot(style = '-.',alpha = 0.7,grid = True,figsize = (16,4),
       subplots = True,
       layout = (1,4))
plt.subplots_adjust(wspace=0.1,hspace=0)

–> 输出的结果为:(可以从图例上看出,每个子图都是对应的columns中的一列数据,如果要绘制在一个图上,将plot中的最后两个参数去掉即可)
在这里插入图片描述

2、主次刻度

之前也讲过刻度的相关的知识点,这里主要是介绍的坐标轴上的主次刻度的划分,这里需要单独引入ticker中的两个模块进行设置 MultipleLocator, FormatStrFormatter

set_major_locator() 设置主刻度
set_minor_locator() 设置次刻度
set_major_formatter() 设置主刻度格式
plt.NullLocator() 删除刻度显示
plt.NullFormatter() 删除文本格式

次刻度只是范围的划定,并不显示对应的数值或字符,一般就不需要设置次刻度的格式

from matplotlib.ticker import MultipleLocator, FormatStrFormatter
t = np.arange(0.0, 100.0, 1)
s = np.sin(0.1*np.pi*t)*np.exp(-t*0.01)
fig = plt.figure(figsize = (10,8))
ax = plt.subplot(111) 
plt.plot(t,s,'--*')

xmajorLocator = MultipleLocator(10) # 将x主刻度标签设置为10的倍数
xmajorFormatter = FormatStrFormatter('%.0f') # 设置x轴标签文本的格式
xminorLocator   = MultipleLocator(5) # 将x轴次刻度标签设置为5的倍数  
ymajorLocator = MultipleLocator(0.5) # 将y轴主刻度标签设置为0.5的倍数
ymajorFormatter = FormatStrFormatter('%.1f') # 设置y轴标签文本的格式
yminorLocator   = MultipleLocator(0.1) # 将此y轴次刻度标签设置为0.1的倍数  

ax.xaxis.set_major_locator(xmajorLocator)  # 设置x轴主刻度
ax.xaxis.set_major_formatter(xmajorFormatter)  # 设置x轴标签文本格式
ax.xaxis.set_minor_locator(xminorLocator)  # 设置x轴次刻度

ax.yaxis.set_major_locator(ymajorLocator)  # 设置y轴主刻度
ax.yaxis.set_major_formatter(ymajorFormatter)  # 设置y轴标签文本格式
ax.yaxis.set_minor_locator(yminorLocator)  # 设置y轴次刻度

ax.xaxis.grid(True, linestyle = "-",which='both') #x坐标轴的网格使用主刻度
ax.yaxis.grid(True, linestyle = "-",which='minor') #y坐标轴的网格使用次刻度

#删除坐标轴的刻度显示
#ax.yaxis.set_major_locator(plt.NullLocator()) 
#ax.xaxis.set_major_formatter(plt.NullFormatter()) 

–> 输出的结果为:(注意这里输出的y轴上主刻度上显示的虚线,是个人倾向设置的默认样式,如果之前没有设置,这里应该是什么也没有的)
在这里插入图片描述

3、注解

plt.text(x,y,s,**kwargs) 横坐标,纵坐标,注解字符串,和其他参数(对注解的文本进行设置的参数,比如下面的fontsize)

3.1 单个文本数据注解
df = pd.DataFrame(np.random.randn(10,2))
df.plot(style = '--o')
plt.text(5,0.5,'hahaha',fontsize=10)  

–> 输出的结果为:
在这里插入图片描述

3.2 多文本数据注解

进行单文本注释,在日常工作中并不怎么常用,经常使用的方式还是进行多文本数据的注释(比如希望直接在图线上显示对应的y轴信息,一般是数值的显示),代码操作如下

df = pd.DataFrame(np.random.randn(10,1))
df.plot(style = '--o')

for i,j in zip(df.index,df.values):
    plt.text(i-0.05,j+0.1, '%.f' %j, fontsize = 10)

–> 输出的结果为:(可以通过ij的数值大小进行注释文本数据的上下左右位置的调节,字符串可以使用格式化的方式输出)
在这里插入图片描述

4、图表输出

plt.savefig() 第一个参数就是文件输出的路径,其次主要使用的参数就是dpi图像的像素大小(分辨率)设定,影响了输出图像的清晰度

1) 也可以有其他参数的设定,一般不再这里使用,因为执行到这一步主要是进行图像存储的,需要调整的话应在这步之前就已经将图像的格式调整完毕了

2) 输出的图像的格式可以通过后缀名进行指定,常见的文件格式可以有png,pdf,svg,ps,eps…等

df = pd.DataFrame(np.random.randn(1000, 4), columns=list('ABCD'))
df = df.cumsum()
df.plot(style = '--.',alpha = 0.5)
plt.legend(loc = 'upper left')
plt.savefig('C:\\Users\\86177\\Desktop\\demo.png',
            dpi=400,
            bbox_inches = 'tight',
            facecolor = 'g',
            edgecolor = 'b')

–> 输出的结果为:(bbox_inches:图表需要保存的部分。如果设置为‘tight’,则尝试剪除图表周围的空白部分。facecoloredgecolor: 图像的背景色,默认为‘w’(白色))
在这里插入图片描述
关于dpi分辨率的设定,建议也在之前的个人风格中进行设定一下,dpi=400,已经够用了,可以看出上图即便是直接上传到博客,其清晰度也十分不错

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lys_828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值