目录
- figure/axis/axes/plt分别表示什么?
- plt
- Figure:可以解释为画布。
- Axes 是图像中具有数据空间的区域
- Axis 坐标轴
- 总结
- 图像元素说明
- 中文解决问题
- 绘图实例
- 图像坐标轴调整
- 参考文章
figure/axis/axes/plt分别表示什么?
matplot绘图的基础就是由上述图片中的元素所构成,我把他们理解为元素或者模块。画图就是一个一个小的元素组合在一起的结果。
plt
导入的matplotlib库的api使者,所有后续的操作都是从这个使者引入进来的。
Figure:可以解释为画布。
- 也就是一切元素堆砌的基础。画图的第一步就是创建画布。
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
- num:图像编号或名称,数字为编号 ,字符串为名称
- figsize:指定figure的宽和高,单位为英寸;
- dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
- facecolor:背景颜色
- edgecolor:边框颜色
- frameon:是否显示边框
import matplotlib.pyplot as plt
创建自定义图像
fig=plt.figure(figsize=(4,3),facecolor='blue')
plt.show()
Axes 是图像中具有数据空间的区域
可以直接理解为对象、元素。 一个figure中可以包含多个 Axes,但一个给定的 Axes 对象只能在一个图形中。 Axes 包含两个(或在 3D 的情况下为三个)Axis 对象(注意 Axes 和 Axis 之间的区别),它们负责数据限制(数据限制也可以通过 set_xlim() 和 set_ylim 进行设置 () 轴方法)。 每个轴都有一个标题(通过 set_title() 设置)、一个 x 标签(通过 set_xlabel() 设置)和一个通过 set_ylabel() 设置的 y 标签。如果你的figure有subplot,那么每一个subplot就是一个axes。
Axis 坐标轴
每个坐标轴实际上也是由竖线和数字组成的,每一个竖线其实也是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。
总结
1、Figure:画布,Axes的容器
2、Axes:图像有效区域。包含坐标轴以及图像
3、Axis:坐标轴
4、画图的时候plt函数或者axes面向对象绘图都可以。
图像元素说明
- xlim,ylim指定坐标轴的取值范围,
- title指定图的名称,
- xlabel,ylabel设置坐标轴名字及其字体大小,支持Latex语法。
- yscale对坐标轴刻度值的函数,有log等选项。
- minorticks_on打开最小刻度线,
- tick_params(which=‘minor’,direction=‘in’,width=2,length=4)控制主次刻度线的长度,宽度和朝向,
- (top=‘off’,bottom=‘on’,left=‘on’,right=‘off’)设置主刻度线在上下左右四条边上是否显示,
- tick_params(labeltop=‘off’,labelbottom=‘on’,labelleft=‘on’,labelright=‘off’)设置刻度值(ticklabel)在上下左右四条边上是否显示。
- xtick([])关闭x轴坐标刻度,yticks([…1],[…2])设置刻度值名称,支持Latex语法。
- axis(‘off’)关闭坐标轴显示。
- grid打开网格线,ax.xaxis.grid()打开x轴的网格线,并设置格式。alpha是透明度,值越大透明度越,越不透明。
- ax.axes.get_yaxis().set_visible(False)设置坐标轴是上的刻度不可见,但轴仍在。
- ax.xaxis.set_ticks_position(‘top’)设置x轴的刻度是位于哪一条边上,一般选top或者bottom,ax.spines设置上下左右四条边的颜色、线型、位置等,a
- x.xaxis.set_major_locator等,设置坐标轴主次刻度值的分辨率
- tick.label1.set_fontsize(15)设置刻度值字体大小。
调整子图之间的相对位置
plt.subplots_adjust(top=0.92, bottom=0.12, left=0.12, right=0.95, hspace=0.25,wspace=0.35)
中文解决问题
程序中引入
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
如果引入以后运行还是出现问题,那就需要下载这个文件的tff文件。并放在指定目录下
yourpath\site-packages\matplotlib\mpl-data\fout\
绘图实例
#!/usr/bin/env python
# coding:utf-8
from email import header
import imp
from re import X
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from datahandler.dataprovider import DataProvider
from datahandler.gtifwriter import GTifWriter
from matplotlib.pyplot import MultipleLocator, title
from matplotlib import font_manager
import os
import datetime
# 用来显示中文标签
zhfont1 = font_manager.FontProperties(fname=os.path.join(os.path.dirname(os.path.abspath(__file__)),'font/simhei.ttf'))
plt.rcParams['font.sans-serif'] = ['SimHei']
# 用来显示负号
plt.rcParams['axes.unicode_minus'] = False
# 调整生成的图表最大尺寸
plt.rcParams['figure.figsize'] = (15.0, 12.0)
plt.rcParams['figure.dpi'] = 100
plt.rc('font',family='Times New Roman')
subFontsize = 18
subTitleFontsize = 26
def draw(time,exceldata,hdfdata,title,outfile):
#front是标签属性:包括字体、大小等
font = {'family' : 'Times New Roman',
'weight' : 'normal',
'size' : 18,
}
x = time[:-1]
fig,ax=plt.subplots(1,2) # 绘制横向两个图
plt.suptitle(title,
fontproperties=zhfont1,
fontsize=subTitleFontsize)# 设置主标题
for i,key in enumerate(exceldata.keys()):
y1 = exceldata[key][:-1]
y2 = hdfdata[:,i]
plt.subplot(121) # 横向第一个
plt.plot(x,y1,linewidth=0.5, color="red",label="{} csv value".format(key))
plt.subplot(122) #横向第二个
plt.plot(x,y2,linewidth=0.5, color="blue",label="{} hdf value".format(key))
print(key)
x_major_locator=MultipleLocator(25)#横坐标以每25显示
y_major_locator=MultipleLocator(100)#纵坐标以每100显示
subtitle = ['CSV文件','HDF文件']
for i in range(len(ax)):
’‘’
给每一个子图添加坐标轴和标题
‘’‘
plt.subplot(1,2,i+1) # 编辑第i+1个图
ax[i].xaxis.set_major_locator(x_major_locator) # 等间距坐标标注
ax[i].yaxis.set_major_locator(y_major_locator)
ax[i].set_xlabel("UTC时间", fontsize=subFontsize,fontproperties=zhfont1) #设置坐标轴,中文显示
ax[i].set_ylabel("Value", fontsize=subFontsize,fontdict=font)
plt.title(subtitle[i],
fontproperties=zhfont1,
fontsize=subTitleFontsize)
plt.xticks(rotation = 45) # X坐标轴标注角度偏移
plt.legend(
loc = 'upper right',
prop = {'size':12},
ncol = 2 ) # ncol 表示图例的列数
plt.xticks(fontsize = subFontsize)
plt.yticks(fontsize = subFontsize)
plt.tight_layout() # 自动调整图片的大小以适应于画布
plt.savefig(outfile)
结果展示:
图像坐标轴调整
实验例子需求说明
该图示要求横坐标时间跨度为3天,实时更新数据,纵坐标轴要求表示为科学计数法,并标注横向分割线和纵向边界线。
def draw(x,hdfdata,subtitles,outfile,title,legend,colors,stime = '',etime = '',ymin=10**-4, ymax=10**1,threshold=10**3,yaxis='count/cm**2*KeV*s*sr'):
#front是标签属性:包括字体、大小等
font = {'family' : 'Times New Roman',
'weight' : 'normal',
'size' : 14,
}
fig, ax = plt.subplots()
plt.title(title, fontsize='36', fontweight='heavy', pad=42,fontproperties=zhfont1)
ax.text(1,
1,
subtitles[0],
horizontalalignment='right',
verticalalignment='bottom',
transform=ax.transAxes,
fontproperties=zhfont1,
fontsize=subTitleFontsize)
ax.text(0.5,
1,
subtitles[1],
horizontalalignment='center',
verticalalignment='bottom',
transform=ax.transAxes,
fontproperties=zhfont1,
fontsize=subTitleFontsize)
ax.text(0,
1,
subtitles[2],
horizontalalignment='left',
verticalalignment='bottom',
transform=ax.transAxes,
fontproperties=zhfont1,
fontsize=subTitleFontsize)
x = pd.to_datetime(x) # 将字符串转为时间格式
for i in range((hdfdata.shape[1])):
y2 = hdfdata[:,i]
ax.semilogy(x,y2,linewidth=1, color=colors[i],label="{}".format(legend[i])) # 纵坐标轴为10的N次幂
# 设置完整的一整天或者三天的时间刻度,指定横轴时间跨度
lims=[np.datetime64(stime), np.datetime64(etime)]
ax.set_xlim(lims)
ax.xaxis.set_major_locator(MultipleLocator(0.25)) # 设置x轴标签间隔
ax.set_xlabel("UTC时间", fontsize=subFontsize,fontproperties=zhfont1)
ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d %H:%M'))#设置时间标签显示格式
ax.set_ylabel(yaxis, fontsize=subFontsize,fontdict=font)
#以10的幂次方进行表示
ax.set_ylim(ymin, ymax)
ax.set_yscale('log')
ax.tick_params(which='minor',length=0) # 设置刻度
plt.legend(
loc = 'upper right',
prop = {'size':12},
ncol = 2)
plt.xticks(fontsize = subTitleFontsize)
plt.yticks(fontsize = subTitleFontsize)
plt.axhline(y=threshold, color='r', linestyle='dashdot',linewidth=1) # 绘制水平线 此处为y=10
plt.tight_layout()
print('=========================')
plt.savefig(outfile)
plt.close()
参考文章
plt与Axes绘图对比边框线及坐标轴的设置绘图布局官方案例官方API