当前位置: 首页 > news >正文

Python图表库Matplotlib 组成部分介绍

来自:

https://www.cnblogs.com/rustfisher/p/15042912.html

 

 Python图表库Matplotlib 组成部分介绍

图表有很多个组成部分,例如标题、x/y轴名称、大刻度小刻度、线条、数据点、注释说明等等。

我们来看官方给的图,图中标出了各个部分的英文名称(下图所示):

anatomy.png

Matplotlib提供了很多api,开发者可根据需求定制图表的样式。

绘图

先绘制一个示例图。然后以此为基础进行定制。

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
for i in range(0, 365):x_list.append(i)y_list.append(math.sin(i * 0.1))
ax = plt.gca()
ax.set_title('matplotlib example')
ax.set_xlabel('x')
ax.set_ylabel('y = sin(x)')
ax.grid()
plt.plot(x_list, y_list)
plt.show()

运行得到

图片

 

红色框里的是 figure;绿色框里的叫做 ax。
代码中 ax = plt.gca() 获取到的就是绿色框框里的部分(对象)。

Figure 大图

Figure代表整张图,暂时称为“全图”或者“大图”。一张图里可以有多个子图表。最少必须要有一个图表。像上面那样。

Axes 数据图

图里显示着数据,暂称为“数据图”。一个大图里可以有多个数据图。但单个数据图对象只能在1个大图里。

多张数据图 subplots

例如同时存在2个数据图
subplot1-2.png

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
y2_list = []
for i in range(0, 365):x_list.append(i)y_list.append(math.sin(i * 0.1))y2_list.append(math.cos(i * 0.1))
fig, (ax1, ax2) = plt.subplots(2)
ax1.set_title('matplotlib-demo 1')
ax2.set_title('matplotlib-demo 2')
ax1.set_xlabel('x')
ax1.set_ylabel('y = sin(x)')
ax2.set_xlabel('x')
ax2.set_ylabel('y = cos(x)')
ax1.plot(x_list, y_list)
ax2.plot(x_list, y2_list)
plt.show()

 

调用subplots()接口,传入数字指定要多少张数据图。
返回的多张图要用括号括起来。每个数据图可以绘制(plot)不同的数据。
标题用set_title()来设置。

可以看到上下两张图太挤了,有重叠部分。可以在plt.show()之前加一个 fig.tight_layout() 让它们拉开一点距离。
subplot1-2-tight.png

坐标轴

对于2维数据图,它有2个坐标,横坐标和纵坐标。有一些接口可以设置参数。
例如控制坐标轴的名字 set_xlabel()  set_ylabel

显示数据范围

set_xlim 方法可以控制x轴数据显示范围。同理y轴用set_ylim来控制。
对于显示范围,set_xlim 方法主要参数为leftright;或者用 xmin xmax。这两套不能同时使用。
set_ylim 主要参数是 top bottom;或者 ymin ymax。这两套不能同时使用。

增加显示范围控制的代码

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
y2_list = []
for i in range(0, 365):x_list.append(i)y_list.append(math.sin(i * 0.1))y2_list.append(math.cos(i * 0.1))
fig, (ax1, ax2) = plt.subplots(2)
ax1.set_title('matplotlib-demo 1')
ax1.set_xlabel('x')
ax1.set_ylabel('y = sin(x)')
ax2.set_title('matplotlib-demo 2')
ax2.set_xlabel('x')
ax2.set_ylabel('y = cos(x)')ax1.set_xlim(left=50, right=200.6)  # 控制x轴显示范围
ax1.set_ylim(top=1, bottom=0.3)  # 控制y轴显示范围

ax2.set_xlim(xmin=1, xmax=156.6)  # 控制x轴显示范围
ax2.set_ylim(ymin=-0.3, ymax=0.3)  # 控制y轴显示范围

ax1.plot(x_list, y_list)
ax2.plot(x_list, y2_list)
fig.tight_layout()
plt.show()

 

运行结果
xylim.png

刻度

tick意思是标记。在坐标轴上的是刻度。Major tick暂称为大刻度,minor tick暂称为小刻度。
使用set_xticks方法控制刻度显示。传入的列表是我们希望显示的刻度。
minor参数默认为False,不显示小刻度。

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
y2_list = []
for i in range(0, 365):x_list.append(i)y_list.append(math.sin(i * 0.1))y2_list.append(math.cos(i * 0.1))
fig, (ax1, ax2) = plt.subplots(2)
ax1.set_title('matplotlib-demo 1')
ax1.set_xlabel('x')
ax1.set_ylabel('y = sin(x)')
ax2.set_title('matplotlib-demo 2')
ax2.set_xlabel('x')
ax2.set_ylabel('y = cos(x)')ax1.set_xlim(left=50, right=200.6)  # 控制x轴显示范围
ax1.set_ylim(top=1, bottom=0.3)  # 控制y轴显示范围

ax2.set_xlim(xmin=1, xmax=156.6)  # 控制x轴显示范围
ax2.set_ylim(ymin=-0.3, ymax=0.3)  # 控制y轴显示范围

ax1.set_xticks([50, 60, 70, 150])
ax1.set_yticks([0.1, 0.2, 0.3, 0.7, 0.9])
ax1.grid()  # 显示格子

ax2.set_xticks([1, 60, 70, 150], minor=True)
ax2.set_yticks([-0.1, 0, 0.1, 0.3], minor=True)
ax2.grid()ax1.plot(x_list, y_list)
ax2.plot(x_list, y2_list)
fig.tight_layout()
plt.show()

 

关键代码如下

ax1.set_xticks([50, 60, 70, 150])
ax1.set_yticks([0.1, 0.2, 0.3, 0.7, 0.9])
ax1.grid()  # 显示格子

ax2.set_xticks([1, 60, 70, 150], minor=True)
ax2.set_yticks([-0.1, 0, 0.1, 0.3], minor=True)
ax2.grid()

 

可见当minor=True,传入的刻度列表有可能不显示。

也可以控制大刻度上的文字旋转

    plt.setp(ax1.xaxis.get_majorticklabels(), rotation=-45)plt.setp(ax2.xaxis.get_majorticklabels(), rotation=-60)

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
y2_list = []
for i in range(0, 365):x_list.append(i)y_list.append(math.sin(i * 0.1))y2_list.append(math.cos(i * 0.1))
fig, (ax1, ax2) = plt.subplots(2)
ax1.set_title('matplotlib-demo 1')
ax1.set_xlabel('x')
ax1.set_ylabel('y = sin(x)')
ax2.set_title('matplotlib-demo 2')
ax2.set_xlabel('x')
ax2.set_ylabel('y = cos(x)')ax1.set_xlim(left=50, right=200.6)  # 控制x轴显示范围
ax1.set_ylim(top=1, bottom=0.3)  # 控制y轴显示范围

ax2.set_xlim(xmin=1, xmax=156.6)  # 控制x轴显示范围
ax2.set_ylim(ymin=-0.3, ymax=0.3)  # 控制y轴显示范围

ax1.set_xticks([50, 60, 70, 150])
ax1.set_yticks([0.1, 0.2, 0.3, 0.7, 0.9])
ax1.grid()  # 显示格子

ax2.set_xticks([1, 60, 70, 150], minor=True)
ax2.set_yticks([-0.1, 0, 0.1, 0.3], minor=True)
ax2.grid()plt.setp(ax1.xaxis.get_majorticklabels(), rotation=-45)
plt.setp(ax2.xaxis.get_majorticklabels(), rotation=-60)ax1.plot(x_list, y_list)
ax2.plot(x_list, y2_list)
fig.tight_layout()
plt.show()

 

边线 spine

spine 是脊柱的意思,这里我们先称为边线。有上下左右4条边线。名称是 top bottom left right
可以直接从图表对象获取它的边线,比如右边线 ax1.spines.right

一些简单的操作,例如

  • set_visible 显示和隐藏
  • set_ticks_position 刻度显示的位置
  • set_bounds 边线显示范围
  • set_linewidth 线的宽度

隐藏右边线和上边线

ax1.spines.right.set_visible(False)
ax1.spines.top.set_visible(False)

让刻度显示在右边和上方

ax2.yaxis.set_ticks_position('right')
ax2.xaxis.set_ticks_position('top')

设置边线显示范围

ax3.spines.left.set_bounds(-0.5, 0.5)
ax3.spines.top.set_bounds(340, 400)

设置线的宽度

ax3.spines.bottom.set_linewidth(2)

完整代码如下

import matplotlib.pyplot as plt
import numpy as np
import math x_list = []
y_list = []
for i in range(0, 365):x_list.append(i)y_list.append(math.sin(i * 0.1))fig, (ax1, ax2, ax3) = plt.subplots(3)
ax_list = [ax1, ax2, ax3]
for i in range(0, 3):cur_ax = ax_list[i]cur_ax.set_title('matplotlib-demo.com ' + str(i))cur_ax.plot(x_list, y_list)cur_ax.set_xlabel('x')cur_ax.set_ylabel('y = sin(x)')ax1.spines.right.set_visible(False)
ax1.spines.top.set_visible(False)ax2.spines.bottom.set_visible(False)
ax2.spines.left.set_visible(False)
ax2.yaxis.set_ticks_position('right')
ax2.xaxis.set_ticks_position('top')ax3.spines.left.set_bounds(-0.5, 0.5)
ax3.spines.top.set_bounds(340, 400)
ax3.spines.bottom.set_linewidth(2)fig.tight_layout()
plt.show()

 

运行截图

数据点

控制数据点的样式。下面我们在一张图表里绘制多条数据线。

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
y2_list = []
y3_list = []
for i in range(0, 20):x_list.append(i)y_list.append(math.sin(i) * 2 - 4)y2_list.append(math.sin(i) * 2)y3_list.append(math.cos(i) * 1.3 + 3)plt.plot(x_list, y_list, color='blue', linestyle='-.', linewidth=2, markersize=4)
plt.plot(x_list, y2_list, 'go', linewidth=1)
plt.plot(x_list, y3_list, 'r+')
plt.show()

 

plot()方法中,支持多种选项。

linestyle支持的选项
'-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'

注释 legend

添加注释,调用lengend()方法。

在前面代码基础上添加

    plt.plot(x_list, y_list, color='blue', linestyle='-.', linewidth=2, markersize=4)plt.plot(x_list, y2_list, 'go', linewidth=1)plt.plot(x_list, y3_list, 'r+')plt.legend(['math.sin(i) * 2 - 4', 'math.sin(i) * 2', 'math.cos(i) * 1.3 + 3'])

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
y2_list = []
y3_list = []
for i in range(0, 20):x_list.append(i)y_list.append(math.sin(i) * 2 - 4)y2_list.append(math.sin(i) * 2)y3_list.append(math.cos(i) * 1.3 + 3)plt.plot(x_list, y_list, color='blue', linestyle='-.', linewidth=2, markersize=4)
plt.plot(x_list, y2_list, 'go', linewidth=1)
plt.plot(x_list, y3_list, 'r+')
plt.legend(['math.sin(i) * 2 - 4', 'math.sin(i) * 2', 'math.cos(i) * 1.3 + 3'])
plt.show()

 

控制注释显示的地方,添加bbox_to_anchorbbox_transform属性

plt.legend(['math.sin(i) * 2 - 4', 'math.sin(i) * 2', 'math.cos(i) * 1.3 + 3'], bbox_to_anchor=(1, 1),bbox_transform=plt.gcf().transFigure)

import matplotlib.pyplot as plt
import numpy as np
import mathx_list = []
y_list = []
y2_list = []
y3_list = []
for i in range(0, 20):x_list.append(i)y_list.append(math.sin(i) * 2 - 4)y2_list.append(math.sin(i) * 2)y3_list.append(math.cos(i) * 1.3 + 3)plt.plot(x_list, y_list, color='blue', linestyle='-.', linewidth=2, markersize=4)
plt.plot(x_list, y2_list, 'go', linewidth=1)
plt.plot(x_list, y3_list, 'r+')
plt.legend(['math.sin(i) * 2 - 4', 'math.sin(i) * 2', 'math.cos(i) * 1.3 + 3'], bbox_to_anchor=(1, 1), bbox_transform=plt.gcf().transFigure)
plt.show()

 

中文乱码问题

在设置标题用到中文的时候,可能会出现乱码。
可以设置rcParams的字体,解决乱码问题。

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

至此,我们把图表中各个部分都简要介绍了一下。

 

http://www.hskmm.com/?act=detail&tid=39504

相关文章:

  • so文件找不到却可以使用的解决
  • 继承与多态动手动脑 - 20243867孙堃2405
  • 2025年自动上料机厂家权威推荐榜:螺旋上料机、真空上料机、粉末上料机、管链输送机全系列选购指南
  • 计数题合集
  • 太突然!湘潭大学计算机学院刘昊霖教授不幸逝世,年仅37岁。
  • pyarmor解密
  • pyd逆向处理
  • 反编译解包微信小程序
  • 浅谈C++中的作用域
  • 2025年摩托车厂家权威推荐榜:覆盖街车、跑车、巡航车及越野车型的全方位选购指南与实力解析
  • 解包魔改pyinstaller
  • 2025年锡条厂家推荐排行榜,高温抗氧化锡条,焊接专用锡条,电子行业锡条,工业级锡条公司精选
  • 类和对象project3
  • 2025年透声膜厂家推荐排行榜,防水透声膜,防水透气透声膜,手表透气透声膜,耳机透气透声膜,智能手环透声膜公司推荐
  • 2025年冠晶石厂家推荐排行榜,外墙冠晶石,内墙冠晶石,防霉冠晶石,水包水冠晶石,水包砂冠晶石,耐污冠晶石,自洁冠晶石公司推荐
  • 安装配置 Claude Code Router 备忘录
  • 2025年包装机厂家权威推荐榜单:全自动包装机,真空包装机,食品包装机,立式包装机源头厂家综合实力解析
  • 2025年自动包装机厂家推荐排行榜:食品包装机,药品包装机,五金配件包装机,全自动包装设备公司精选
  • 2025 年 10 月系统门窗厂商榜单揭晓,专业智造实力与品牌保障口碑优选
  • 2025年环境试验设备厂家推荐排行榜,冷热冲击/高低温/快速温变试验箱,氙灯/紫外耐候气候环境试验箱,步入式/恒温恒湿试验箱,高压加速老化/HAST/PCT试验箱,机械环境/淋雨/砂尘试验箱公司推荐
  • OI 笑传 #23
  • 2025年半自动包装机厂家权威推荐榜:食品/医药/化工行业专用机型精选,高效稳定与性价比之选
  • [ java 锁 - 04 - Integer o = 1 作为 锁的问题]
  • 2025年提升机厂家权威推荐榜:自动提升机、垂直提升机、斗式提升机、物料提升设备源头厂家精选
  • 2025年自动提升机厂家权威推荐榜单:专业制造与高效解决方案深度解析
  • [java 锁 - 03 重入写法 ]
  • 2025年包装机厂家权威推荐榜:自动包装机,半自动包装机,高效包装设备源头厂家精选与选购指南
  • golang: gin项目常用第三方库
  • ssh: 连接报错
  • python3: ubuntu上安装时报错: No module named zlib