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 多系列图,分别绘制
这种就是根据创建的DataFrame
的columns
中的元素进行绘制
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)
–> 输出的结果为:(可以通过i
和j
的数值大小进行注释文本数据的上下左右位置的调节,字符串可以使用格式化的方式输出)
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’
,则尝试剪除图表周围的空白部分。facecolor
,edgecolor
: 图像的背景色,默认为‘w’
(白色))
关于dpi
分辨率的设定,建议也在之前的个人风格中进行设定一下,dpi=400
,已经够用了,可以看出上图即便是直接上传到博客,其清晰度也十分不错