目录
一、初识Matploblib
Matplotlib是Python中的绘图库,类似于MATLAB,可以用来绘制各种静态,动态,交互式的图表。
1.1 Figure
在绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画布才能开始绘图。
import matplotlib.pyplot as plt
fig = plt.figure()
1.2 Axes
拥有Figure对象之后,我们还需要创建绘图区域,添加Axes。在绘制子图过程中,对于每一个子图可能有不同设置,而 Axes 可以直接实现对于单个子图的设定。figure、axes和axis的区别如下图所示。
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',
ylabel='Y-Axis', xlabel='X-Axis')
plt.show()
以上的代码,在一幅图上添加了一个Axes,然后设置了这个Axes的X轴以及Y轴的取值范围(这些设置并不是强制的,后面会再谈到关于这些设置),效果如下图:
对于上面的fig.add_subplot(111)就是添加Axes的,参数的解释的在画板的第1行第1列的第一个位置生成一个Axes对象来准备作画。也可以通过fig.add_subplot(2, 2, 1)的方式生成Axes,前面两个参数确定了面板的划分,例如 2, 2会将整个面板划分成 2 * 2 的方格,第三个参数取值范围是 [1, 2*2] 表示第几个Axes。如下面的例子:
fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(224)
可以发现我们上面添加 Axes 似乎有点弱鸡,所以提供了下面的方式一次性生成所有 Axes:
fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')
fig 还是我们熟悉的画板, axes 成了我们常用二维数组的形式访问,这在循环绘图时,额外好用。
1.3 Axes vs pyplot
下面的代码采用pyplot绘图,很简单易懂,但只适合简单地绘图,可快速地将草图绘出。在处理复杂的绘图工作,特别是有多个子图时,我们最好还是使用 Axes 来完成作画。
plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)
plt.xlim(0.5, 4.5)
plt.show()
1.4 设置画布大小
在使用matplotlib作图时,会遇到图片显示不全或者图片大小不是我们想要的,这个时候就需要调整画布大小。下例左图为500*500像素,右图为1000*1000像素。
import matplotlib.pyplot as plt
# 500 x 500 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(111)
plt.show()
1.5 设置网格线
通过 axes 对象提供的 grid() 方法可以开启或者关闭画布中的网格以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。
grid() 的函数使用格式如下:
grid(color='b', ls = '-.', lw = 0.25)
参数含义如下:
- color:表示网格线的颜色;
- ls:表示网格线的样式;
- lw:表示网格线的宽度;
网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。
实例如下:
import matplotlib.pyplot as plt
import numpy as np
# fig画布;axes子图区域
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
x = np.arange(1, 11)
axes[0].plot(x, x ** 3, 'g', lw=2)
# 开启网格
axes[0].grid(True)
axes[0].set_title('default grid')
axes[1].plot(x, np.exp(x), 'r')
# 设置网格的颜色,线型,线宽
axes[1].grid(color='b', ls='-.', lw=0.25)
axes[1].set_title('custom grid')
axes[2].plot(x, x)
axes[2].set_title('no grid')
fig.tight_layout()
plt.show()
1.6 设置坐标轴
set_xlabel
用字符串列表来设置坐标轴的标签,fontsize
设置轴标签的字体和字号等参数。
import matplotlib.pyplot as plt
import numpy as np
fontdict = {'weight': 'normal', 'family': 'Times New Roman', 'size': 20}
fig, axes = plt.subplots(1, 1)
x = np.arange(1, 5)
axes.plot(x, np.exp(x))
axes.plot(x, x ** 2)
# 设置标题
axes.set_title("Normal scale", fontdict=fontdict)
# 设置x、y轴标签
axes.set_xlabel("x axis", fontdict=fontdict)
axes.set_ylabel("y axis", fontdict=fontdict)
plt.show()
Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。
import matplotlib.pyplot as plt
import numpy as np
fig, a1 = plt.subplots(1, 1)
x = np.arange(1, 10)
a1.plot(x, np.exp(x), 'r')
a1.set_title('exp')
# 设置y轴
a1.set_ylim(0, 4000)
# 设置x轴
a1.set_xlim(0, 8)
plt.show()
移动坐标轴以及为坐标轴添加箭头可以通过mpl_toolkits.axisartist实现,如下例所示。
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
# 新建一个画板(画图视窗)
fig = plt.figure('Sine Wave')
# 新建一个绘图区对象ax,并添加到画板中
ax = axisartist.Subplot(fig, 1, 1, 1)
fig.add_axes(ax)
# 隐藏默认坐标轴(上下左右边框)
ax.axis[:].set_visible(False)
# ax.axis["top"].set_visible(False)
# ax.axis["right"].set_visible(False)
# 新建可移动的坐标轴X-Y
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["y"] = ax.new_floating_axis(1, 0)
# 设置刻度标识方向
ax.axis["x"].set_axis_direction('top')
ax.axis["y"].set_axis_direction('left')
# 加上坐标轴箭头,设置刻度标识位置
ax.axis["x"].set_axisline_style("->", size=2.0)
ax.axis["y"].set_axisline_style("->", size=2.0)
ax.axis["x"].set_axis_direction('top')
ax.axis["y"].set_axis_direction('left')
# 画上y=sin(t)折线图,设置刻度范围,设置刻度标识,设置坐标轴位置
t = np.linspace(0, 2 * np.pi)
y = np.sin(t)
ax.plot(t, y, color='red', linewidth=2)
plt.title('y = 2sin(2t)', fontsize=14, pad=20)
ax.set_xticks(np.linspace(0.25, 1.25, 5) * np.pi)
ax.set_yticks([0, 1, 2])
# 设置刻度标识显示
ax.set_xlim(-0.5 * np.pi, 1.5 * np.pi)
ax.set_ylim(-2, 2)
plt.show()
其中,创建坐标轴的方法有两种:
new_fixed_axis(self, loc, offset=None)和new_floating_axis(self, nth_coord, value, axis_direction=‘bottom’),而new_floating_axis()相对更加灵活。
(1)nth_coord:坐标轴方向,0代表X方向,1代表Y方向
(2)value:坐标轴处于位置,如果是平行与X轴的新坐标轴,则代表Y位置(即通过(0,value)),如果是平行与Y轴的新坐标轴,则代表X位置(即通过(value,0))。
(3)axis_direction:代表刻度标识字的方向,可选[‘top’, ‘bottom’, ‘left’, ‘right’]
1.7 设置刻度和标签
刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。
xticks() 和 yticks() 函数接受一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。如下所示:
ax.set_xticks([2,4,6,8,10])
x 轴上的刻度标记,依次为 2,4,6,8,10。您也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。
下面示例介绍了刻度和标签的使用方法,其中对标签逆时针旋转了90°:
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(0, math.pi * 2, 0.05)
fig, ax = plt.subplots(1, 1, figsize=(5, 6))
y = np.sin(x)
ax.plot(x, y)
# 设置x轴标签
ax.set_xlabel('angle')
# ax.set_title('sine')
ax.set_xticks([0, 2, 4, 6])
# 设置x轴刻度标签,并旋转90°
ax.set_xticklabels(['zero', 'two', 'four', 'six'], rotation=90)
# 设置y轴刻度
ax.set_yticks([-1, 0, 1])
plt.show()
1.8 添加图例和标题
图例通过ax.legend或者plt.legend()实现,标题通过ax.set_title()或者plt.title()实现,基本用法如下例所示。
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y = np.sin(x)
y1 = np.cos(x)
ax.plot(x, y, label=r"$\sin(x)$")
ax.plot(x, y1, label=r"$\cos(x)$")
ax.legend(loc="best")
ax.set_title("正弦函数和余弦函数的折线图")
plt.show()
调整图例
对于图例,我们还可以通过改变legend()的参数来改变图例的显示位置,展示样式(包括图例的外边框、图例中的文本标签的排列位置和图例的投影效果等方面)。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2.1, 0.1)
y = np.power(x, 3)
y1 = np.power(x, 2)
y2 = np.power(x, 1)
plt.plot(x, y, ls="-", lw=2, label="$x^{3}$")
plt.plot(x, y1, c="r", ls="-", lw=2, label="$x^{2}$")
plt.plot(x, y2, c="y", ls="-", lw=2, label="$x^{1}$")
plt.legend(loc="upper left", bbox_to_anchor=(0.05, 0.95),
ncol=3, title="power function", shadow=True,
fancybox=True)
plt.show()
plt.legend()的位置参数loc也可以使用数字,其对应如下:
字符串 | 位置编号 | 位置表述 |
---|---|---|
best | 0 | 最佳位置 |
upper right | 1 | 右上角 |
upper left | 2 | 左上角 |
lower left | 3 | 右下角 |
lower right | 4 | 左下角 |
right | 5 | 右侧 |
center left | 6 | 左侧垂直居中 |
center right | 7 | 右侧垂直居中 |
lower center | 8 | 下方水平居中 |
upper center | 9 | 上方水平居中 |
center | 10 | 正中间 |
此外还用到了线框位置参数bbox_to_anchor,它的参数值是一个四元元组,且使用Axes坐标系统。也就是说第一个元素代表距离画布左侧的x轴长度的倍速的距离;第二个元素代表距离画布底部的y轴长度的倍数的距离;第三个元素代表元素x轴长度的倍数的线框长度;第四个元素代表y轴长度的倍数的线框宽度。plt.legend(loc = "upper left",bbox_to_anchor=(0.05,0.95),ncol = 3,title = "power function",shadow=True,fancybox=True)会把图例放在上方左手边拐角处的距离坐标轴左边0.1,底部7.6的位置。关键字参数shadow控制线框是否添加阴影;fancybox控制线框是直角还是圆角。
调整标题
对于标题,也可以通过参数控制各种文本属性。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2, 2, 1000)
y = np.exp(x)
plt.plot(x, y, ls="-", lw=2, color="g")
plt.title("center demo")
plt.title("Left Demo", loc="left",
fontdict={"size": "xx-large",
"color": "r",
"family": "Times New Roman"})
plt.title("Right Demo", loc="right",
size=20, color="c",
style="oblique",
family="Comic Sans MS")
plt.show()
上面展示了plt.title()中参数的两种使用方法。其中位置参数loc可以选择“left”,“center”和“right”。family控制的是字体类别,size控制字体大小,color控制字体颜色,style控制字体风格。
1.9 设置中文显示
Matplotlib 默认不支持中文字体,只支持 ASCII 字符,但中文标注更加符合中国人的阅读习惯。
当直接使用中文时,Matplotlib 绘制的图像会出现中文乱码,如左图所示。通过临时重写配置文件的方法,可以解决 Matplotlib 显示中文乱码的问题,代码如下所示:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
year = [2017, 2018, 2019, 2020]
people = [20, 40, 60, 70]
# 生成图表
plt.plot(year, people)
plt.xlabel('年份')
plt.ylabel('人口')
plt.title('人口增长')
# 设置纵坐标刻度
plt.yticks([0, 20, 40, 60, 80])
# 设置填充选项:参数分别对应横坐标,纵坐标,纵坐标填充起始值,填充颜色
plt.fill_between(year, people, 20, color='green')
# 显示图表
plt.show()
1.10 设置数学表达式显示
Matplotlib中的文本字符串都可以使用 Latex 格式显现出来,具体的使用方法是将文本标记符放在一对美元符号$
内,语法格式如下:
# 绘制表达式 r'$\alpha_i> \beta_i$'
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2 * np.pi * t)
# 绘制函数图像
plt.plot(t, s)
# 设置标题
plt.title(r'$\alpha_i> \beta_i$', fontsize=20)
# 设置数学表达式
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize=20)
# 设置数学表达式
plt.text(0.1, -0.5, r'$\sqrt{2}$', fontsize=10)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()
1.11 调整子图布局
在pyplot模块中,与调整子图布局的函数主要为subplots_adjust和tight_layout,其中subplots_adjust是修改子图间距的通用函数,tight_layout默认执行一种固定的间距配置,也可以自定义间距配置,底层原理类似于subplots_adjust函数。
subplots_adjust
subplots_adjust函数的功能为调整子图的布局参数。对于没有设置的参数保持不变,初始值由rcParams["figure.subplot.[name]"]提供。
用法:matplotlib.pyplot.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
参数:
- left:所有子图整体相对于图像的左外边距,距离单位为图像宽度的比例(小数)。可选参数。浮点数。默认值为0.125。
- right:所有子图整体相对于图像的右外边距,距离单位为图像宽度的比例(小数)。可选参数。浮点数。默认值为0.0。
- bottom:所有子图整体相对于图像的下外边距,距离单位为图像高度的比例(小数)。可选参数。浮点数。默认值为0.11。
- top:所有子图整体相对于图像的上外边距,距离单位为图像高度的比例(小数)。可选参数。浮点数。默认值为0.88。
- wspace:子图间宽度内边距,距离单位为子图平均宽度的比例(小数)。浮点数。默认值为0.2。
- hspace:子图间高度内边距,距离单位为子图平均高度的比例(小数)。可选参数。浮点数。默认值为0.2。
示例代码如下:
import matplotlib.pyplot as plt
# 原始间距配置
fig, ax = plt.subplots(3, 3)
print(vars(fig.subplotpars))
# 通过subplots_adjust()设置间距配置
plt.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.5, hspace=0.5)
print(vars(fig.subplotpars))
plt.show()
原始间距:
修改间距后(wspace=0.5, hspace=0.5):
tight_layout
pyplot模块中的tight_layout()函数可用于自动调整子图参数或按指定参数填充。通过设置rcParams['figure.autolayout']=True可图像自动应用tight_layout。
用法: matplotlib.pyplot.tight_layout(pad=1.08, h_pad=None, w_pad=None, rect=None)
参数:
- pad:此参数用于在图形边和子图的边之间进行填充,以字体大小的一部分表示。
- h_pad,w_pad:这些参数用于相邻子图的边之间的填充(高度/宽度),作为字体大小的一部分。
- rect:此参数是整个子图区域将适合的归一化图形坐标中的矩形。
1.12 保存图片
使用savefig()函数可将图片保存在指定目录下,在show()前插入,如果在show()后面会出现保存图片为空白现象。
plt.savefig("example.png")
采用下面的方法可以保存去除旁边空白区域和坐标轴的图片,论文绘图时常用。
pyplot.axis('off') #增加这行关闭坐标轴显示
#关键在于bbox_inches = 'tight',pad_inches = 0,去掉空白区域
pyplot.savefig(save_dir,bbox_inches = 'tight',pad_inches = 0)
二、常见绘图属性
2.1 绘图标记
绘图过程如果我们想要给坐标自定义一些不一样的标记,就可以使用 plot() 方法的 marker 参数来定义。
以下实例定义了实心圆标记:
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([1, 3, 4, 5, 8, 9, 6, 1, 3, 4, 5, 2, 4])
plt.plot(ypoints, marker='o')
plt.show()
marker 可以定义的符号如下:
以下实例定义了 * 标记:
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([1, 3, 4, 5, 8, 9, 6, 1, 3, 4, 5, 2, 4])
plt.plot(ypoints, marker='*')
plt.show()
fmt 参数
fmt 参数定义了基本格式,如标记、线条样式和颜色。
fmt = '[marker][line][color]'
例如 o:r,o 表示实心圆标记,: 表示虚线,r 表示颜色为红色。
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, 'o:r')
plt.show()
线类型:
线类型标记 | 描述 | |
---|---|---|
'-' | 实线 | |
':' | 虚线 | |
'--' | 破折线 | |
'-.' | 点划线 |
颜色类型:
颜色标记 | 描述 | |
---|---|---|
'r' | 红色 | |
'g' | 绿色 | |
'b' | 蓝色 | |
'c' | 青色 | |
'm' | 品红 | |
'y' | 黄色 | |
'k' | 黑色 | |
'w' | 白色 |
详细颜色对照表
颜色及十六进制对应
cnames = { 'aliceblue': '#F0F8FF', 'antiquewhite': '#FAEBD7', 'aqua': '#00FFFF', 'aquamarine': '#7FFFD4', 'azure': '#F0FFFF', 'beige': '#F5F5DC', 'bisque': '#FFE4C4', 'black': '#000000', 'blanchedalmond': '#FFEBCD', 'blue': '#0000FF', 'blueviolet': '#8A2BE2', 'brown': '#A52A2A', 'burlywood': '#DEB887', 'cadetblue': '#5F9EA0', 'chartreuse': '#7FFF00', 'chocolate': '#D2691E', 'coral': '#FF7F50', 'cornflowerblue': '#6495ED', 'cornsilk': '#FFF8DC', 'crimson': '#DC143C', 'cyan': '#00FFFF', 'darkblue': '#00008B', 'darkcyan': '#008B8B', 'darkgoldenrod': '#B8860B', 'darkgray': '#A9A9A9', 'darkgreen': '#006400', 'darkkhaki': '#BDB76B', 'darkmagenta': '#8B008B', 'darkolivegreen': '#556B2F', 'darkorange': '#FF8C00', 'darkorchid': '#9932CC', 'darkred': '#8B0000', 'darksalmon': '#E9967A', 'darkseagreen': '#8FBC8F', 'darkslateblue': '#483D8B', 'darkslategray': '#2F4F4F', 'darkturquoise': '#00CED1', 'darkviolet': '#9400D3', 'deeppink': '#FF1493', 'deepskyblue': '#00BFFF', 'dimgray': '#696969', 'dodgerblue': '#1E90FF', 'firebrick': '#B22222', 'floralwhite': '#FFFAF0', 'forestgreen': '#228B22', 'fuchsia': '#FF00FF', 'gainsboro': '#DCDCDC', 'ghostwhite': '#F8F8FF', 'gold': '#FFD700', 'goldenrod': '#DAA520', 'gray': '#808080', 'green': '#008000', 'greenyellow': '#ADFF2F', 'honeydew': '#F0FFF0', 'hotpink': '#FF69B4', 'indianred': '#CD5C5C', 'indigo': '#4B0082', 'ivory': '#FFFFF0', 'khaki': '#F0E68C', 'lavender': '#E6E6FA', 'lavenderblush': '#FFF0F5', 'lawngreen': '#7CFC00', 'lemonchiffon': '#FFFACD', 'lightblue': '#ADD8E6', 'lightcoral': '#F08080', 'lightcyan': '#E0FFFF', 'lightgoldenrodyellow': '#FAFAD2', 'lightgreen': '#90EE90', 'lightgray': '#D3D3D3', 'lightpink': '#FFB6C1', 'lightsalmon': '#FFA07A', 'lightseagreen': '#20B2AA', 'lightskyblue': '#87CEFA', 'lightslategray': '#778899', 'lightsteelblue': '#B0C4DE', 'lightyellow': '#FFFFE0', 'lime': '#00FF00', 'limegreen': '#32CD32', 'linen': '#FAF0E6', 'magenta': '#FF00FF', 'maroon': '#800000', 'mediumaquamarine': '#66CDAA', 'mediumblue': '#0000CD', 'mediumorchid': '#BA55D3', 'mediumpurple': '#9370DB', 'mediumseagreen': '#3CB371', 'mediumslateblue': '#7B68EE', 'mediumspringgreen': '#00FA9A', 'mediumturquoise': '#48D1CC', 'mediumvioletred': '#C71585', 'midnightblue': '#191970', 'mintcream': '#F5FFFA', 'mistyrose': '#FFE4E1', 'moccasin': '#FFE4B5', 'navajowhite': '#FFDEAD', 'navy': '#000080', 'oldlace': '#FDF5E6', 'olive': '#808000', 'olivedrab': '#6B8E23', 'orange': '#FFA500', 'orangered': '#FF4500', 'orchid': '#DA70D6', 'palegoldenrod': '#EEE8AA', 'palegreen': '#98FB98', 'paleturquoise': '#AFEEEE', 'palevioletred': '#DB7093', 'papayawhip': '#FFEFD5', 'peachpuff': '#FFDAB9', 'peru': '#CD853F', 'pink': '#FFC0CB', 'plum': '#DDA0DD', 'powderblue': '#B0E0E6', 'purple': '#800080', 'red': '#FF0000', 'rosybrown': '#BC8F8F', 'royalblue': '#4169E1', 'saddlebrown': '#8B4513', 'salmon': '#FA8072', 'sandybrown': '#FAA460', 'seagreen': '#2E8B57', 'seashell': '#FFF5EE', 'sienna': '#A0522D', 'silver': '#C0C0C0', 'skyblue': '#87CEEB', 'slateblue': '#6A5ACD', 'slategray': '#708090', 'snow': '#FFFAFA', 'springgreen': '#00FF7F', 'steelblue': '#4682B4', 'tan': '#D2B48C', 'teal': '#008080', 'thistle': '#D8BFD8', 'tomato': '#FF6347', 'turquoise': '#40E0D0', 'violet': '#EE82EE', 'wheat': '#F5DEB3', 'white': '#FFFFFF', 'whitesmoke': '#F5F5F5', 'yellow': '#FFFF00', 'yellowgreen': '#9ACD32'}
标记大小与颜色
我们可以自定义标记的大小与颜色,使用的参数分别是:
- markersize,简写为 ms:定义标记的大小。
- markerfacecolor,简写为 mfc:定义标记内部的颜色。
- markeredgecolor,简写为 mec:定义标记边框的颜色。
设置标记大小:
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20)
plt.show()
设置标记外边框颜色:
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20, mec='r')
plt.show()
设置标记内部颜色:
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20, mfc='r')
plt.show()
自定义标记内部与边框的颜色:
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20, mec='r', mfc='y')
plt.show()
2.2 Windows字体中英文名称对照
中文名称 | 英文名称 |
黑体 | SimHei |
微软雅黑 | Microsoft YaHei |
微软雅黑 | Microsoft YaHei |
新宋体 | NSimSun |
新细明体 | PMingLiU |
细明体 | MingLiU |
标楷体 | DFKai-SB |
仿宋 | FangSong |
楷体 | KaiTi |
仿宋_GB2312 | FangSong_GB2312 |
楷体_GB2312 | KaiTi_GB2312 |
三、基本绘图
3.1 折线图
plot()函数画出一系列的点,并且用线将它们连接起来。看下例子:
x = np.linspace(0, np.pi)
y_sin = np.sin(x)
y_cos = np.cos(x)
ax1.plot(x, y_sin)
ax2.plot(x, y_sin, 'go--', linewidth=2, markersize=12)
ax3.plot(x, y_cos, color='red', marker='+', linestyle='dashed')
在上面的三个Axes上作画。plot,前面两个参数为x轴、y轴数据。ax2的第三个参数是 MATLAB风格的绘图,对应ax3上的颜色,marker,线型。
另外,我们可以通过关键字参数的方式绘图,如下例:
x = np.linspace(0, 10, 200)
data_obj = {'x': x,
'y1': 2 * x + 1,
'y2': 3 * x + 1.2,
'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}
fig, ax = plt.subplots()
#填充两条线之间的颜色
ax.fill_between('x', 'y1', 'y2', color='yellow', data=data_obj)
# Plot the "centerline" with `plot`
ax.plot('x', 'mean', color='black', data=data_obj)
plt.show()
发现上面的作图,在数据部分只传入了字符串,这些字符串对一个这 data_obj 中的关键字,当以这种方式作画时,将会在传入给 data 中寻找对应关键字的数据来绘图。
3.2 散点图
只画点,不用线连接起来。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
y = np.random.randn(10)
plt.scatter(x, y, color='red', marker='+')
plt.show()
3.3 双轴图
在一些应用场景中,有时需要绘制两个 x 轴或两个 y 轴,这样可以更直观地显现图像,从而获取更有效的数据。Matplotlib 提供的 twinx() 和 twiny() 函数,除了可以实现绘制双轴的功能外,还可以使用不同的单位来绘制曲线,比如一个轴绘制对函数,另外一个轴绘制指数函数。
下面示例绘制了一个具有两个 y 轴的图形,一个显示正弦函数 sin(x),另一个显示对数函数 log(x)。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
t = np.arange(0.01, 10.0, 0.01)
data1 = np.exp(t)
data2 = np.sin(2 * np.pi * t)
# 设置主轴
fig, ax1 = plt.subplots()
color = 'tab:red'
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp', color=color)
ax1.plot(t, data1, color=color)
ax1.tick_params(axis='y', labelcolor=color)
# 设置次轴
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('sin', color=color)
ax2.plot(t, data2, color=color)
ax2.tick_params(axis='y', labelcolor=color)
fig.tight_layout()
plt.show()
3.4 条形图
条形图分两种,一种是水平的,一种是垂直的,见下例子:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
x = np.arange(5)
y = np.random.randn(5)
fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))
vert_bars = axes[0].bar(x, y, color='lightblue', align='center')
horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')
#在水平或者垂直方向上画线
axes[0].axhline(0, color='gray', linewidth=2)
axes[1].axvline(0, color='gray', linewidth=2)
plt.show()
条形图还返回了一个Artists 数组,对应着每个条形,例如上图 Artists 数组的大小为5,我们可以通过这些 Artists 对条形图的样式进行更改,如下例:
fig, ax = plt.subplots()
vert_bars = ax.bar(x, y, color='lightblue', align='center')
# We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.
for bar, height in zip(vert_bars, y):
if height < 0:
bar.set(edgecolor='darkred', color='salmon', linewidth=3)
plt.show()
3.5 直方图
直方图用于统计数据出现的次数或者频率,有多种参数可以调整,见下例:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(19680801)
n_bins = 10
x = np.random.randn(1000, 3)
fig, axes = plt.subplots(nrows=2, ncols=2)
ax0, ax1, ax2, ax3 = axes.flatten()
colors = ['red', 'tan', 'lime']
ax0.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
ax0.legend(prop={'size': 10})
ax0.set_title('bars with legend')
ax1.hist(x, n_bins, density=True, histtype='barstacked')
ax1.set_title('stacked bar')
ax2.hist(x, histtype='barstacked', rwidth=0.9)
ax3.hist(x[:, 0], rwidth=0.9)
ax3.set_title('different sample sizes')
fig.tight_layout()
plt.show()
参数中density控制Y轴是概率还是数量,与返回的第一个的变量对应。histtype控制着直方图的样式,默认是 ‘bar’,对于多个条形时就相邻的方式呈现如子图1, ‘barstacked’ 就是叠在一起,如子图2、3。 rwidth 控制着宽度,这样可以空出一些间隙,比较图2、3. 图4是只有一条数据时。
3.6 饼图
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs')
fig1, (ax1, ax2) = plt.subplots(2)
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True)
ax1.axis('equal')
ax2.pie(sizes, autopct='%1.2f%%', shadow=True, startangle=90, explode=explode,
pctdistance=1.12)
ax2.axis('equal')
ax2.legend(labels=labels, loc='upper right')
plt.show()
3.7 箱形图
箱型图(也称为盒须图)于 1977 年由美国著名统计学家约翰·图基(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。
在箱型图中,我们从上四分位数到下四分位数绘制一个盒子,然后用一条垂直触须(形象地称为“盒须”)穿过盒子的中间。上垂线延伸至上边缘(最大值),下垂线延伸至下边缘(最小值)。箱型图结构如下所示:
首先准备创建箱型图所需数据:可以使用numpy.random.normal()
函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量然后用 data_to_plot 变量指定创建箱型图所需的数据序列,最后用 boxplot() 函数绘制箱型图。
import matplotlib.pyplot as plt
import numpy as np
# 利用随机数种子使每次生成的随机数相同
np.random.seed(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)
data_to_plot = [collectn_1, collectn_2, collectn_3, collectn_4]
fig = plt.figure()
# 创建绘图区域
ax = fig.add_subplot(111)
# 创建箱型图
bp = ax.boxplot(data_to_plot)
plt.show()
3.8 泡泡图
散点图的一种,加入了第三个值 s 可以理解成普通散点,画的是二维,泡泡图体现了Z的大小,如下例:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(19680801)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2 # 0 to 15 point radii
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()
3.9 等高线图(轮廓图)
等高线图(也称“水平图”)是一种在二维平面上显示 3D 图像的方法。等高线有时也被称为 “Z 切片”,如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。
import numpy as np
import matplotlib.pyplot as plt
"""
np.linspace()在指定的大间隔内[-4.0,4.0],返回固定间隔100个数据
"""
x = np.linspace(-4.0, 4.0, 100)
y = np.linspace(-4.0, 4.0, 100)
"""
np.meshgrid()两个坐标轴上的点在平面上画格,产生一个以向量x为行,向量y为列的矩
"""
X, Y = np.meshgrid(x, y)
# 定义Z与X,Y之间的关系,即原方程x²+y²=r²
Z = np.sqrt(X ** 2 + Y ** 2)
fig, axes = plt.subplots(1, 2, figsize=(16, 9))
axes[0].contour(X, Y, Z, alpha=0.75, cmap=plt.cm.hot)
cp = axes[1].contourf(X, Y, Z, cmap=plt.cm.hot)
fig.colorbar(cp)
plt.show()