文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Matplotlib详细教程

2023-09-16 07:17

关注

目录

一、初识Matploblib

1.1 Figure

1.2 Axes

1.3 Axes vs pyplot

1.4 设置画布大小

1.5 设置网格线

1.6 设置坐标轴

1.7 设置刻度和标签

1.8 添加图例和标题

1.9 设置中文显示

1.10 设置数学表达式显示

1.11 调整子图布局

1.12 保存图片

二、常见绘图属性

2.1 绘图标记

2.2 Windows字体中英文名称对照

三、基本绘图

3.1 折线图 

3.2 散点图

3.3 双轴图

3.4 条形图 

3.5 直方图

3.6 饼图 

3.7 箱形图 

3.8 泡泡图

3.9 等高线图(轮廓图)


一、初识Matploblib

Matplotlib是Python中的绘图库,类似于MATLAB,可以用来绘制各种静态,动态,交互式的图表。

1.1 Figure

 在绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画布才能开始绘图。 

import matplotlib.pyplot as pltfig = 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)

参数含义如下:

网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。

实例如下:

import matplotlib.pyplot as pltimport 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 pltimport numpy as npfontdict = {'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 pltimport numpy as npfig, 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 npimport matplotlib.pyplot as pltimport 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-Yax.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 pltimport numpy as npimport mathx = 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 mplmpl.rcParams["font.sans-serif"] = ["SimHei"]mpl.rcParams["axes.unicode_minus"] = Falseimport matplotlib.pyplot as pltimport numpy as npfig = 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 pltimport numpy as npx = 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也可以使用数字,其对应如下:

字符串位置编号位置表述
best0最佳位置
upper right1右上角
upper left2左上角
lower left3右下角
lower right4左下角
right5右侧
center left6左侧垂直居中
center right7右侧垂直居中
lower center8下方水平居中
upper center9上方水平居中
center10正中间

此外还用到了线框位置参数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 pltimport numpy as npx = 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 pltplt.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 npimport matplotlib.pyplot as pltt = 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)

参数:

示例代码如下:

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)

参数

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 pltimport numpy as npypoints = 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 pltimport numpy as npypoints = 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 pltimport numpy as npypoints = np.array([6, 2, 13, 10])plt.plot(ypoints, 'o:r')plt.show()

线类型:

线类型标记描述
'-'实线
':'虚线
'--'破折线
'-.'点划线

颜色类型:

颜色标记描述
'r'红色
'g'绿色
'b'蓝色
'c'青色
'm'品红
'y'黄色
'k'黑色
'w'白色

详细颜色对照表 

109fa03e9a1a0ef1d53f8999766ddd56.png

颜色及十六进制对应

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 pltimport numpy as npypoints = np.array([6, 2, 13, 10])plt.plot(ypoints, marker='o', ms=20)plt.show()

 设置标记外边框颜色:

import matplotlib.pyplot as pltimport numpy as npypoints = np.array([6, 2, 13, 10])plt.plot(ypoints, marker='o', ms=20, mec='r')plt.show()

 设置标记内部颜色:

import matplotlib.pyplot as pltimport numpy as npypoints = np.array([6, 2, 13, 10])plt.plot(ypoints, marker='o', ms=20, mfc='r')plt.show()

 自定义标记内部与边框的颜色:

import matplotlib.pyplot as pltimport numpy as npypoints = 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 pltimport numpy as npx = 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 pltimport 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 pltimport numpy as npnp.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 pltimport numpy as npnp.random.seed(19680801)n_bins = 10x = 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 pltlabels = '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 pltimport 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 pltimport numpy as npnp.random.seed(19680801)N = 50x = 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 radiiplt.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 npimport 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()

来源地址:https://blog.csdn.net/weixin_42620109/article/details/126466337

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯