python数据分析|Matplotlib属性及注解


文章目录

  • Axes绘图的方法
  • Axes关于坐标轴的方法
    • Axes.set_xticks(self, ticks, minor=False)
    • Axes.set_xticklabels(self, labels, fontdict=None, minor=False, **kwargs)
  • 注解annotate
  • 鼠标滑过显示隐藏内容用annotate实现

大多数图标修饰工作主要有两种方式:使用程序性的pyplot接口(即matplotlib.pyplot)和更多面向对象原生的matplotlibAPI。
matplotlib主要就是理解figure(画布)、axes(坐标系)、axis(坐标轴)三者之间的关系。
python数据分析|Matplotlib属性及注解
文章图片

除去set_axis_off,set_axis_on,set_axisbelow,其他去掉set_前缀都可以做为plt.subplot的参数。 【python数据分析|Matplotlib属性及注解】
plt.subplot(211, sharex=ax1, sharey=ax1, label='label',alpha=0.5, fc='r', yscale='log')

Axes绘图的方法
方法 说明
Axes.plot 将y对x绘制为线条或标记。
Axes.errorbar 将y与x绘制为带有错误栏的线和/或标记。
Axes.scatter y与y的散点图
Axes.plot_date 绘制强制轴以将浮点数视为日期的图。
Axes.step 绘制一个阶梯图。
Axes.loglog 在x轴和y轴上使用对数缩放绘制图。
Axes.semilogx 在x轴上绘制具有对数比例的图。
Axes.semilogy 用y轴上的对数比例绘制图。
Axes.fill_between 填充两条水平曲线之间的区域。
Axes.fill_betweenx 填充两条垂直曲线之间的区域。
Axes.bar 绘制条形图。
Axes.barh 绘制水平条形图。
Axes.bar_label 标记条形图。
Axes.stem 创建一个茎图。
Axes.eventplot 在给定位置绘制相同的平行线。
Axes.pie 绘制饼图。
Axes.stackplot 绘制堆积面积图。
Axes.broken_barh 绘制矩形的水平序列。
Axes.vlines 在每个x上绘制从ymin到ymax的垂直线。
Axes.hlines 在从xmin到xmax的每个y上绘制水平线。
Axes.fill 绘制填充的多边形。
Axes.axhline 在轴上添加一条水平线。
Axes.axhspan 在轴上添加水平跨度(矩形)。
Axes.axvline 在轴上添加一条垂直线。
Axes.axvspan 在轴上添加垂直跨度(矩形)。
Axes.axline 添加无限长的直线。
Axes.acorr 绘制x的自相关。
Axes.angle_spectrum 绘制角度光谱。
Axes.cohere 绘制x和y之间的相干性。
Axes.csd 绘制交叉光谱密度。
Axes.magnitude_spectrum 绘制幅度谱。
Axes.phase_spectrum 绘制相位谱。
Axes.psd 绘制功率谱密度。
Axes.specgram 绘制频谱图。
Axes.xcorr 绘制x和y之间的互相关。
Axes.clabel 标注等高线图。
Axes.contour 绘制轮廓线。
Axes.contourf 绘制填充轮廓。
Axes.imshow 将数据显示为图像,即在2D常规栅格上。
Axes.matshow 将2D矩阵或数组的值绘制为颜色编码的图像。
Axes.pcolor 创建具有非规则矩形网格的伪彩色图。
Axes.pcolorfast 创建具有非规则矩形网格的伪彩色图。
Axes.pcolormesh 创建具有非规则矩形网格的伪彩色图。
Axes.spy 绘制2D阵列的稀疏模式。
Axes.get_xaxis_transform 获取用于绘制x轴标签,刻度线和网格线的转换。
Axes.get_yaxis_transform 获取用于绘制y轴标签,刻度线和网格线的转换。
Axes.get_data_ratio 返回缩放数据的纵横比。
Axes关于坐标轴的方法
方法 说明
Axes.axis 获取或设置某些轴属性的便捷方法。
Axes.set_axis_off 关闭x和y轴。
Axes.set_axis_on 开启x和y轴。
Axes.set_frame_on 设置是否绘制轴矩形补丁。
Axes.get_frame_on 获取是否绘制了轴矩形补丁。
Axes.set_axisbelow 设置轴刻度线和网格线是在图上方还是下方。
Axes.get_axisbelow 获取轴刻度和网格线是在图上方还是下方。
Axes.grid 增加网格线。
Axes.get_facecolor 获取轴的表面色。
Axes.set_facecolor 设置轴的表面色。
Axes.invert_xaxis 反转x轴。
Axes.xaxis_inverted 返回x轴是否沿“反”方向定向。
Axes.invert_yaxis 反转y轴。
Axes.yaxis_inverted 返回y轴是否沿“反”方向定向。
Axes.set_xlim 设置x轴范围。
Axes.get_xlim 返回x轴范围。
Axes.set_ylim 设置y轴范围。
Axes.get_ylim 返回y轴范围。
Axes.set_xbound 设置x轴的上下边界。
Axes.get_xbound 以递增顺序返回x轴的上下边界。
Axes.set_ybound 设置y轴的上下边界。
Axes.get_ybound 以递增顺序返回y轴的上下边界。
Axes.set_xlabel 设置x轴的标签。
Axes.get_xlabel 获取xlabel文本字符串。
Axes.set_ylabel 设置y轴的标签。
Axes.get_ylabel 获取ylabel文本字符串。
Axes.set_title(self, label, fontdict=None, loc=None, pad=None, *, y=None) 为轴设置标题。fontdict:{‘fontsize’: rcParams[‘axes.titlesize’],‘fontweight’: rcParams[‘axes.titleweight’], ‘color’: rcParams[‘axes.titlecolor’],‘verticalalignment’: ‘baseline’,‘horizontalalignment’: loc}。loc : {‘center’, ‘left’, ‘right’}
Axes.get_title(self, loc=“center”) 获取轴标题。left,center,right。
Axes.legend 在轴上放置一个图例。
Axes.get_legend 返回Legend实例,如果未定义图例,则返回None。
Axes.get_legend_handles_labels(self, legend_handler_map=None) 返回图例的句柄和标签
Axes.set_xscale 设置x轴比例。
Axes.get_xscale 返回xaxis的比例尺(以str表示)。
Axes.set_yscale 设置y轴比例。
Axes.get_yscale 返回yaxis的比例尺(以str表示)。
Axes.set_xticks 设置xaxis的刻度位置。
Axes.get_xticks 返回数据坐标中xaxis的刻度位置。
Axes.set_xticklabels 使用字符串标签列表设置xaxis的标签。
Axes.get_xticklabels 获取xaxis的刻度标签。
Axes.get_xmajorticklabels 返回xaxis的主要刻度标签,作为的列表Text。
Axes.get_xminorticklabels 返回xaxis的次刻度标签,作为的列表Text。
Axes.get_xgridlines 返回xaxis的网格线作为Line2Ds的列表。
Axes.get_xticklines 以x的列表形式返回xaxis的刻度线Line2D。
Axes.xaxis_date 设置轴刻度和标签,以将沿x轴的数据视为日期。
Axes.set_yticks 设置yaxis的刻度位置。
Axes.get_yticks 返回数据坐标中yaxis的刻度位置。
Axes.set_yticklabels 使用字符串标签列表设置yaxis标签。
Axes.get_yticklabels 获取yaxis的刻度标签。
Axes.get_ymajorticklabels 返回yaxis的主要刻度标签,作为的列表Text。
Axes.get_yminorticklabels 返回yaxis的次要刻度标签,作为的列表Text。
Axes.get_ygridlines 返回yaxis的网格线作为Line2Ds的列表。
Axes.get_yticklines 返回yaxis的刻度线作为Line2Ds的列表。
Axes.yaxis_date 设置轴刻度和标签,以将沿y轴的数据视为日期。
Axes.minorticks_off 去除轴上的细小滴答声。
Axes.minorticks_on 在轴上显示较小的刻度。
Axes.ticklabel_format 配置ScalarFormatter默认情况下用于线性轴。
Axes.tick_params 更改刻度线,刻度线标签和网格线的外观。
Axes.set_major_locator(self, locator) 设定刻度位置。locator : ~matplotlib.ticker.Locator
Axes.set_xticks(self, ticks, minor=False) 设置x轴刻度,默认情况下刻度也有标签。
  • ticks:此参数是x轴刻度位置的列表。
  • minor:此参数用于设置主要刻度线还是设置次要刻度线
Axes.set_xticklabels(self, labels, fontdict=None, minor=False, **kwargs) 用字符串标签列表设置xaxis标签。
  • labels:此参数是字符串标签的列表。
  • fontdict:此参数是控制刻度标签外观的字典。
    默认值方块是:{‘fontsize’: rcParams[‘axes.titlesize’],
    ‘fontweight’: rcParams[‘axes.titleweight’],
    ‘verticalalignment’: ‘baseline’,
    ‘horizontalalignment’: loc}
  • minor:默认值:False,是否设置次要刻度线标签而不是主要刻度线标签。
import numpy as np import matplotlib.pyplot as pltdef main(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(np.random.randn(1000).cumsum()) ticks = ax.set_xticks([0, 250, 500, 750, 1000]) label = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=30, fontsize='small') ax.set_title('My') ax.set_xlabel("Stages") plt.show()if __name__ == '__main__': main()

注解annotate annotate用于在图形上给数据添加文本注解,而且支持带箭头的划线工具,方便我们在合适的位置添加描述信息。
Axes.annotate(s, xy, *args, **kwargs)

  • s:注释文本的内容
  • xy:被注释的坐标点,二维元组形如(x,y)
  • xytext:注释文本的坐标点,也是二维元组,默认与xy相同
  • xycoords:被注释点的坐标系属性,允许输入的值如下
属性值 含义
‘figure points’ 以绘图区左下角为参考,单位是点数
‘figure pixels’ 以绘图区左下角为参考,单位是像素数
‘figure fraction’ 以绘图区左下角为参考,单位是百分比
‘axes points’ 以子绘图区左下角为参考,单位是点数(一个figure可以有多个axex,默认为1个)
‘axes pixels’ 以子绘图区左下角为参考,单位是像素数
‘axes fraction’ 以子绘图区左下角为参考,单位是百分比
‘data’ 以被注释的坐标点xy为参考 (默认值)
‘polar’ 不使用本地数据坐标系,使用极坐标系
  • textcoords :注释文本的坐标系属性,默认与xycoords属性值相同,也可设为不同的值。除了允许输入xycoords的属性值,还允许输入以下两种:
属性值 含义
‘offset points’ 相对于被注释点xy的偏移量(单位是点)
‘offset pixels’ 相对于被注释点xy的偏移量(单位是像素)
  • arrowprops:箭头的样式,dict(字典)型数据,如果该属性非空,则会在注释文本和被注释点之间画一个箭头。如果不设置’arrowstyle’ 关键字,则允许包含以下关键字:
关键字 含义
width 箭头的宽度(单位是点)
headwidth 箭头头部的宽度(点)
headlength 箭头头部的长度(点)
shrink 箭头两端收缩的百分比(占总长)
? 任何的关键字
如果设置了‘arrowstyle’关键字,以上关键字就不能使用。允许的值有:
箭头的样式 属性
‘-’ None
‘->’ head_length=0.4,head_width=0.2
‘-[’ widthB=1.0,lengthB=0.2,angleB=None
-
'- >’
‘<-’ head_length=0.4,head_width=0.2
‘<->’ head_length=0.4,head_width=0.2
'< -’
'< -
‘fancy’ head_length=0.4,head_width=0.4,tail_width=0.4
‘simple’ head_length=0.5,head_width=0.5,tail_width=0.2
‘wedge’ tail_width=0.3,shrink_factor=0.5
  • annotation_clip : 布尔值,可选参数,默认为空。设为True时,只有被注释点在子图区内时才绘制注释;设为False时,无论被注释点在哪里都绘制注释。仅当xycoords为‘data’时,默认值空相当于True。
示例:设置了箭头的颜色和缩进
import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots() # 绘制一个余弦曲线 t = np.arange(0.0, 5.0, 0.01) s = np.cos(2*np.pi*t) line, = ax.plot(t, s, lw=2) # 绘制一个黑色,两端缩进的箭头 ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), xycoords='data', arrowprops=dict(facecolor='black', shrink=0.05) ) ax.set_ylim(-2, 2) plt.show()

python数据分析|Matplotlib属性及注解
文章图片

示例:用不同的坐标体系绘制注释
import numpy as np import matplotlib.pyplot as plt # 以步长0.005绘制一个曲线 x = np.arange(0, 10, 0.005) y = np.exp(-x/2.) * np.sin(2*np.pi*x) fig, ax = plt.subplots() ax.plot(x, y) ax.set_xlim(0, 10) ax.set_ylim(-1, 1) # 被注释点的数据轴坐标和所在的像素 xdata, ydata = https://www.it610.com/article/5, 0 xdisplay, ydisplay = ax.transData.transform_point((xdata, ydata)) # 设置注释文本的样式和箭头的样式 bbox = dict(boxstyle="round", fc="0.8") arrowprops = dict( arrowstyle = "->", connectionstyle = "angle,angleA=0,angleB=90,rad=10") # 设置偏移量 offset = 72 # xycoords默认为'data'数据轴坐标,对坐标点(5,0)添加注释 # 注释文本参考被注释点设置偏移量,向左2*72points,向上72points ax.annotate('data = https://www.it610.com/article/(%.1f, %.1f)'%(xdata, ydata), (xdata, ydata), xytext=(-2*offset, offset), textcoords='offset points', bbox=bbox, arrowprops=arrowprops) # xycoords以绘图区左下角为参考,单位为像素 # 注释文本参考被注释点设置偏移量,向右0.5*72points,向下72points disp = ax.annotate('display = (%.1f, %.1f)'%(xdisplay, ydisplay), (xdisplay, ydisplay), xytext=(0.5*offset, -offset), xycoords='figure pixels', textcoords='offset points', bbox=bbox, arrowprops=arrowprops) plt.show()

python数据分析|Matplotlib属性及注解
文章图片

示例:极坐标上的注释,在极坐标系绘图,并在极坐标系设置被注释点,以绘图区的百分比为参数放置注释文本。
import numpy as np import matplotlib.pyplot as plt # 绘制一个极地坐标,再以0.001为步长,画一条螺旋曲线 fig = plt.figure() ax = fig.add_subplot(111, polar=True) r = np.arange(0,1,0.001) theta = 2 * 2*np.pi * r line, = ax.plot(theta, r, color='#ee8d18', lw=3) # 对索引为800处画一个圆点,并做注释 ind = 800 thisr, thistheta = r[ind], theta[ind] ax.plot([thistheta], [thisr], 'o') ax.annotate('a polar annotation', xy=(thistheta, thisr),# 被注释点遵循极坐标系,坐标为角度和半径 xytext=(0.05, 0.05),# 注释文本放在绘图区的0.05百分比处 textcoords='figure fraction', arrowprops=dict(facecolor='black', shrink=0.05),# 箭头线为黑色,两端缩进5% horizontalalignment='left',# 注释文本的左端和低端对齐到指定位置 verticalalignment='bottom', ) plt.show()

python数据分析|Matplotlib属性及注解
文章图片

鼠标滑过显示隐藏内容用annotate实现
  1. 创建[点,注释]对的列表,默认情况下,注释不可见
  2. 每次检测到鼠标移动时,都会注册一个函数“on_move”
  3. on_move函数遍历每个点和注释,如果鼠标现在位于其中一个点上,则使其关联的注释可见,如果不是,则使其不可见。
import matplotlib.pyplot as plt fig = plt.figure() po_annotation = [] for i in range(0, 10): x = i y = x**2 point, = plt.plot(x, y, 'o') annotation = plt.annotate(('x='+str(x), 'y='+str(y)), xy=(x+0.1, y+0.1), xycoords='data', xytext=(x+0.7, y+0.7), textcoords='data', horizontalalignment="left", arrowprops=dict(arrowstyle="simple",connectionstyle="arc3,rad=-0.1"), bbox=dict(boxstyle="round", facecolor="w",edgecolor="0.5", alpha=0.9) ) annotation.set_visible(False) po_annotation.append([point, annotation]) def on_move(event): visibility_changed = False for point, annotation in po_annotation: should_be_visible = (point.contains(event)[0] == True) # print(point.contains(event)[0]) if should_be_visible != annotation.get_visible(): visibility_changed = True annotation.set_visible(should_be_visible) if visibility_changed: plt.draw() on_move_id = fig.canvas.mpl_connect('motion_notify_event', on_move) plt.show()

python数据分析|Matplotlib属性及注解
文章图片

    推荐阅读