赞
踩
目录
Matplotlib是Python中的绘图库,类似于MATLAB,可以用来绘制各种静态,动态,交互式的图表。
在绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画布才能开始绘图。
- import matplotlib.pyplot as plt
- fig = plt.figure()
拥有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 成了我们常用二维数组的形式访问,这在循环绘图时,额外好用。
下面的代码采用pyplot绘图,很简单易懂,但只适合简单地绘图,可快速地将草图绘出。在处理复杂的绘图工作,特别是有多个子图时,我们最好还是使用 Axes 来完成作画。
- plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)
- plt.xlim(0.5, 4.5)
- plt.show()
在使用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()
通过 axes 对象提供的 grid() 方法可以开启或者关闭画布中的网格以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。
grid() 的函数使用格式如下:
grid(color='b', ls = '-.', lw = 0.25)
参数含义如下:
网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果只是想开启不带任何样式的网格,可以通过 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()
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’]
刻度指的是轴上数据点的标记,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()
图例通过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控制字体风格。
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()
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()
在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)
参数:
示例代码如下:
- 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)
参数:
使用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)
绘图过程如果我们想要给坐标自定义一些不一样的标记,就可以使用 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'}
标记大小与颜色
我们可以自定义标记的大小与颜色,使用的参数分别是:
设置标记大小:
- 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()
中文名称 | 英文名称 |
黑体 | SimHei |
微软雅黑 | Microsoft YaHei |
微软雅黑 | Microsoft YaHei |
新宋体 | NSimSun |
新细明体 | PMingLiU |
细明体 | MingLiU |
标楷体 | DFKai-SB |
仿宋 | FangSong |
楷体 | KaiTi |
仿宋_GB2312 | FangSong_GB2312 |
楷体_GB2312 | KaiTi_GB2312 |
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 中寻找对应关键字的数据来绘图。
只画点,不用线连接起来。
- 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()
在一些应用场景中,有时需要绘制两个 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()
条形图分两种,一种是水平的,一种是垂直的,见下例子:
- 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()
直方图用于统计数据出现的次数或者频率,有多种参数可以调整,见下例:
- 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是只有一条数据时。
- 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()
箱型图(也称为盒须图)于 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()
散点图的一种,加入了第三个值 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()
等高线图(也称“水平图”)是一种在二维平面上显示 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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。