Matplotlib系列(一):快速绘图入门

Matplotlib系列目录



一、 简介

‎pyplot‎‎是 matplotlib 的一个基于状态的接口。‎可以快速的绘制图表。通常我们绘图只需要通过pyplot的接口就可以了。

matplotlib还有一个pylab接口,pylab接口实际上就是导入了pyplot接口以及numpy,scipy的一些函数。不推荐使用pylab,官网也同样不推荐。

Matplotlib系列将Matplotlib的知识和重点API,编制成思维导图和重点笔记形式,方便记忆和回顾,也方便应用时参考,初学者也可以参考逐步深入学习。

二、 思维导图

Matplotlib快速绘图

三、 Matplotlib快速绘图

1. 两种绘图方式

1.1 过程式绘图

import matplotlib.pyplot as plt
plt.plot(x,y)            #绘制折线图
plt.show()               #显示图形

就这么简单,依次调用pyplot模块中的相应函数就可以完成绘图。

1.2 面向对象绘图

采用面向对象的方式,也非常方便,并且更加容易对图形进行修改控制。

import matplotlib.pyplot as plt
fig=plt.figure()             #创建画布
ax=fig.subplots()            #在画布上创建一个图表
ax.plot(x,y)                 #图表上绘制线条
plt.show()                   #显示图形

画布上可以显示多个图表,fig.subplots()无参数创建图表,默认创建一个图表。

2. matplotlib绘图对象层次组成

在Matplotlib中,一个图形对象由容器、图表、图表元素几层对象组成。

  • Figure:画布对象。是可以包含多个图表的容器。matplotlib中的顶层对象。
    • Text:suptitle,supxlabel,supylabel等画布级别的文本标签。
    • Axes:图表对象。指一个含坐标轴、点线图形、图例等的图表。
      • Text:title标题文本标签
      • Spine:边框,坐标轴线。
      • Axis:XAxis,YAxis坐标轴。
        • Text:label坐标轴标签
        • Tick:刻度元素
          • 主刻度、次刻度
          • 刻度值
          • 网格线
      • Legend:图例
      • Line2D、Markers等图形元素
      • Text:其他文本
    • Legend:图例(放在图表框之外的画布级图例)。
  • Figure对象的属性texts、axes、legends,以及get_children()函数可以获得子对象。
  • Axes对象的属性title、spines、xaxis、yaxis、legend_、lines、texts,以及get_children()函数可以获得子对象。
  • Axis坐标轴通常可以直接用Axes对象的方法直接操作
  • 所有可见的对象,比如Figure、Axes、Line2D、Text等都继承自Artist类。

Matplotlib中用Axes表示图表有点让人容易误解,可能是一个图表包含多个坐标轴吧,所以有人把Axes翻译为轴域或坐标系。

Matplotlib图形组成

如果上图看不到,请到官网图形组成链接查看。

3. Matplotlib面向对象绘图过程

3.1 典型代码示例

先看一个典型的示例

#准备数据
import numpy as np
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)

#导入matplotlib库pyplot模块
import matplotlib.pyplot as plt

#创建画布
fig=plt.figure()

#创建图表
ax=fig.subplots()

#绘制折线图,设置点线样式,设置线条名称
ax.plot(x,y,'+r--', label='line1',mec='b',ms=10)  #点为蓝色+(大小为10),线为红色虚线

#设置坐标轴
ax.set_xlabel('X axis')            #坐标轴文本标签
ax.set_ylabel('Y axis')
ax.set_xticks([-4,-2,0,2,4])       #主刻度
ax.set_xticks(np.arange(-4,4,0.5),minor=True)  #次刻度
ax.set_yticks([-1,-0.5,0,0.5,1])
ax.set_yticks(np.arange(-1.5,1.5,0.1),minor=True)
ax.tick_params(axis='y',labelrotation=30)      #y轴主刻度文字旋转30度
ax.set_xlim(-3.5,3.5)              #设置显示刻度范围
ax.set_ylim(-1.5,1.5)

ax.grid(True)                      #显示主刻度网格

#设置图例
ax.legend()                  #注意需要绘图时,需指定label参数

#设置标题
ax.set_title("sample")

#保存显示图形
fig.savefig("sample.png")
plt.show()

绘图效果如下:

matplotlib绘图效果

3.2 创建画布

  • fig=plt.figure():创建画布
  • fig=plt.figure(figsize=(6.4,4.8),dpi=100):指定画布大小和分辨率创建画布
    • figsize参数格式为(width,height),单位为inch。
    • dpi参数:分辨率,指每inch像素数。默认dpi为100
    • figsize=(6.4,4.8),dpi=100)最终得到的图像为640×480像素大小

3.3 创建图表

  • ax=fig.subplots():在画布上创建一个图表。

fig,ax=plt.subplots()可以创建画布并在画布上创建一个图表

ax=plt.add_axes([0,0,6.4,4.8])也可以创建图表,但是该函数必须指定坐标范围,并且创建的图表没有坐标轴等对象,是完全空白的。

3.4 绘制图形(包含设置点、线样式、颜色)

常见的基本图形包括:

  • ax.scatter(x,y,label=‘name’):散点图
  • ax.plot(x,y,label=‘name’):折线图
  • ax.bar(x,y,label=‘name’):柱状图

matplotlib支持非常多的图形绘制,包括二维图形和三维图形。后续详细解释。

3.4.1 点、线样式,颜色参数

不同的图形,样式也不太相同。

以最常见的点、线样式为主,简单介绍常用参数如下(详细参数见后续章节):

  • ax.plot(x,y,color='b')可以简写为ax.plot(x,y,c='b')设置点和线颜色为blue。
  • ax.plot(x,y,linestyle='-',linewidth=1.5):设置线样式为实线,线宽为1.5。
  • ax.plot(x,y,marker='+',marckersize=1.5):设置点样式为+,大小为1.5。
    • 可以简写为ax.plot(x,y,marker='o',ms=1.5)
  • ax.plot(x,y,fmt='+r-'):用字符串参数,同时设置点样式、点线颜色、线样式
    • 可以简写为ax.plot(x,y,'+r-')
    • fmt的格式为[marker][line][color]

点的边缘颜色、填充颜色等也可以单独设置

  • ax.plot(x,y,'o',markerfacecolor='b',markeredgecolor='r'):设置点颜色参数
    • markerfacecolor设置点填充颜色,markeredgecolor设置点边缘颜色。
    • markerfacecolor='b',markeredgecolor='r'可以简写为mfc='b',mec='r'
3.4.2 颜色参数取值

fmt参数中只能使用简化的颜色写法即:

  • 'r','g','b':‘red’,‘green’,'blue’的简写。
  • 'c','m','y','k':‘cyan’,‘magenta’,‘yellow’,'black’的简写。
  • 'w':'white’的简写。

color参数可以用简写,也可以用全称。

1) 基本颜色简写
  • ‘r’,‘g’,‘b’,‘c’,‘m’,‘y’,‘k’,‘w’
  • ‘red’,‘green’,‘blue’,‘cyan’,‘magenta’,‘yellow’,‘black’,‘white’
2) 颜色名称
  • color='lightblue':参数表示浅蓝颜色

  • Brown, Chocolate, Gold, Gray, Orange, Pink, Purple, Silver, Snow, Tomato, Yellow

  • ForestGreen, SandyBrown, SeaGreen, SkyBlue, SpringGreen, WhiteSmoke

  • GreenYellow, OrangeRed, YellowGreen

  • LightBlue , LightCyan, LightGrey, LightGreen, LightPink, LightYellow

  • LightSeaGreen, LightSkyBlue

  • MediumBlue, MediumPurple, MediumSeaGreen

  • DarkBlue, DarkCyan, DarkGray, DarkGreen, Darkorange, DarkRed, DarkSeaGreen

  • DeepPink, DeepSkyBlue, HotPink

以上为部分颜色名称

  • matplotlib._color_data.CSS4_COLORS可以获得常用的颜色名称。
  • matplotlib.colors.get_named_colors_mapping()可以获取所有的颜色名称。
3) 灰度数值
  • color=0.5:参数表示灰色

[0,1]之间浮点数表示灰度数据。0表示黑色,1表示白色,0.2表示深灰,0.8表示浅灰。

4)十六进制RGB字符串
  • color='#0F0':#RGB格式参数表示绿色
  • color='#00FF00':#RRGGBB格式参数表示绿色
  • color='#00FF0088':#RRGGBBAA表示半透明绿色

不分大小写。’#abc’与’#ABC’相同

5)RGB,RGBA元组
  • color=(0.2,0.1,0.5):(r,g,b)格式参数
  • color=(0.1,0.2,0.5,0.3):(r,g,b,a)格式参数

r,g,b取值范围为[0,1]

6)C0,C1,…CN字符串

用C0,C1,…CN字符串,循环引用rcParams['axes.prop_cycle']中的颜色。

  • color='C30'
  • matplotlib.rcParams['axes.prop_cycle']可以获取颜色列表。
  • C必须大写。

很多绘图函数还支持用预定义的颜色风格ColorMap为数据设置颜色。详解"Matplotlib系列(二)"

3.4.3 线样式参数取值
  • '-':实线(solid line style)
  • '--':虚线(dashed line style)
  • '-.':点划线(dash-dot line style)
  • ':':点线(dotted line style)
3.4.4 点样式参数取值
    • '.':点(point marker)
    • ‘,’:像素点(pixel marker)
    • 'o':实心圆(circle marker)
  • 三角
    • ‘v’:倒三角(triangle_down marker)
    • '^':三角形(triangle_up marker)
    • ‘<’:左三角(triangle_left marker)
    • ‘>’:右三角(triangle_right marker)
  • 多边形
    • 's':四边形(square marker)
    • ‘p’:五边形(pentagon marker)
    • ‘h’:六边形(hexagon1 marker)尖点朝上
    • ‘H’:六边形(hexagon2 marker)平边朝上
    • ‘8’:八边形(octagon marker)
    • 'D':菱形(diamond marker)
    • 'd':瘦菱形(thin_diamond marker)上下长,左右窄
  • 符号形状
    • '+':加号(plus marker)
    • ‘P’:粗加号(plus (filled) marker)
    • '_':减号(hline marker)
    • '|':竖线/减号旋转90度(vline marker)
    • 'x':乘号(x marker)
    • ‘X’:粗乘号(x (filled) marker)
    • '*':五角星(star marker)

3.5 坐标轴设置

  • 设置坐标轴标签文本
    • ax.set_xlabel('X axis')
    • ax.set_ylabel('Y axis')
  • 设置主刻度坐标
    • ax.set_xticks([-4,-2,0,2,4])
    • ax.set_yticks([-1,-0.5,0,0.5,1])
  • 设置次刻度坐标
    • ax.set_xticks(np.arange(-4,4,0.5),minor=True)
    • ax.set_yticks(np.arange(-1.5,1.5,0.1),minor=True)
  • 设置x,y轴坐标刻度显示范围
    • ax.set_xlim(-3.5,3.5)
    • ax.set_ylim(-1.5,1.5)

设置网格

  • ax.grid(visible, which=‘major’, axis=‘both’)
    • visible参数:bool类型,True或者False
    • which参数:可选值{‘major’,‘minor’,‘both’}
    • axis参数:可选值{‘both’,‘x’,‘y’}
    • color参数:网格颜色
    • linestyle参数:网格线样式
    • linewidth参数:网格线宽度

设置刻度样式

  • ax.tick_params(axis='y',labelrotation=30):y轴刻度文字旋转30度。
    • axis参数:可取值{‘x’, ‘y’, ‘both’},默认’both’
    • reset参数:bool类型。在更新参数前是否重置刻度到默认值。默认False
    • direction参数:可取值{‘in’, ‘out’, ‘inout’}。刻度文字位于内部,外部,轴上。默认外部
    • color参数:刻度颜色。
    • labelsize参数:文本大小。
    • labelcolor参数:文本颜色。
    • grid_color参数:网格颜色。

3.6 图例

  • ax.legend():显示图例。若plot为指定label参数,则图例无法显示。
  • ax.legend(['line1','line2',...]:指定图例各个曲线的label名称。如果已有label,则会覆盖

图例样式设置

  • ax.legend(loc='upper right'):自定义图例位置。
    • ‘best’:重叠最小的位置,默认值
    • ‘upper right’:右上
    • ‘upper left’:左上
    • ‘lower left’:左下
    • ‘lower right’:右下
    • ‘center left’:中左
    • ‘center right’:中右
    • ‘lower center’:中下
    • ‘upper center’:中上
  • ax.legend(fontsize='samll'):自定义图例文字大小。
    • 相对大小(字符串)
      • ‘xx-small’,‘x-small’,‘smal’:小于当前默认字体大小
      • ‘medium’:中等
      • ‘large’,‘x-large’,‘xx-large’:大于当前默认字体大小
    • 绝对大小(数值)
      • fontsize=10:绝对字体大小,单位为点。
  • ax.legend(labelcolor=['r','b']):设置图例文本颜色。
  • ax.legend(mode='expand'):图例水平平铺。

3.7 图表标题

  • ax.set_title("sample"):设置图表标题。
  • ax.set_title("title", loc='left'):设置图表标题位置。
    • loc可选值为{‘left’,‘center’,‘right’},默认值为’center’

3.8 保存图形

  • fig.savefig("sample.png"):保存图形到文件。

支持如下格式:

  • jpg, jpeg:jpg图
  • png:png图
  • svg, svgz:svg图
  • tif, tiff:tiff图
  • pgf:pgf位图
  • pdf, eps, ps:pdf或postscript文件
  • raw, rgba

3.9 显示图形

plt.show()

必须调用plt.show()才能显示。

4. 过程式绘图过程

#准备数据
import numpy as np
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)


#导入matplotlib库pyplot模块
import matplotlib.pyplot as plt

#绘制折线图,设置点线样式,设置线条名称
plt.plot(x,y,'+r-.', label='line1')   #点为蓝色+,线为红色点划线


#设置坐标轴
plt.xlabel('X axis')                  #坐标轴文本标签
plt.ylabel('Y axis')
plt.xticks([-4,-2,0,2,4])             #主刻度,不支持次刻度设置
plt.yticks([-1,-0.5,0,0.5,1], rotation=30)
plt.xlim(-3.5,3.5)                    #设置显示刻度范围
plt.ylim(-1.5,1.5)

plt.grid(True,c='gray',linestyle=':') #显示主刻度网格

#设置图例
plt.legend()                          #注意需要绘图时,指定label参数

#设置标题
plt.title("sample")

#保存显示图形
plt.savefig("sample.png")

plt.show()

方法参数基本上与面向对象方式一致。

5. 绘图数据和多子图绘图

5.1 字典数据绘图

import numpy as np
import matplotlib.pyplot as plt

data = {'x': np.arange(50),
        'y': np.random.randint(0, 50, 50),
        'color': np.random.randn(50)}

plt.scatter('x', 'y', c='color', data=data)

plt.show()

效果如下:

字典数据绘图

5.2 多子图绘图

可以用如下方式创建多个子图

  • fig,axarray=plot.subplots(m,n):一次生成m行n列子图
  • axarray=fig.subplots(m,n):一次生成m行n列子图,返回m×n个axes对象
  • fig.add_subplot(m,n,i):增加一个子图,m行n列放在第i个
    • 也可以用fig.add_subplots(mni)方式调用
axarray=plt.subplots(2,2)
ax1=axarray[0]
ax2=axarray[1]
ax3=axarray[2]
ax4=axarray[3]
ax1.plot(x,y)

建议用fig.add_subplots()函数创建多子图。

fig=plt.figure()
ax1=fig.add_subplot(2,2,1)  #2行2列,第1个子图
ax1.plot(x,y,'r-')
ax2=fig.add_subplot(223)    #2行2列,第3个子图
ax2.plot(x,y,'b:')
ax3=fig.add_subplot(1,2,2)  #跨行子图
ax3.plot(x,y,'Dg--')
plt.show()

matplotlib subplot 子图跨行跨列示意图

画布级别标题和标签

  • fig.suptitle(“figtitle”):设置总标题(与所有子图平级)
  • fig.supxlabel(“figxlabel”):设置总x标签(如果所有子图标签相同,可以只设置一个总标签)
  • fig.supylabel(“figxlabel”):设置总y标签

子图间距

  • fig.subplots_adjust(wspace=0.5,hspace=0.5):调整子图之间的间距
    • wspace:表示子图间宽度方向间隔系数
    • hspace:表示子图间高度方向间隔系数
  • fig.tight_layout(pad=1):调整子图四周空白宽度
    • pad:四周空白宽度系数
    • w_pad:宽度方向空白宽度系数
    • h_pad:高度方向空白宽度系数
fig.suptitle("figtitle", x=0.5, y=0.98)
fig.supxlabel("figxlabel", x=0.5, y=0.02)
fig.supylabel("figylabel", x=0.02, y=0.5)
fig.tight_layout(pad=2)

显示效果如下:

matplotlib 子图suptitle



Matplotlib系列目录


个人总结,部分内容进行了简单的处理和归纳,如有谬误,希望大家指出,持续修订更新中。

修订历史版本见:https://github.com/hustlei/AI_Learning_MindMap

未经允许请勿转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hustlei

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

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

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

打赏作者

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

抵扣说明:

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

余额充值