关于 Python 之 Matplotlib 的总结

2023-11-03

通用

图形输出分为嵌入模式和独立窗口模式两种,在交互窗口中可用下面的两条命令控制图形的输出形式。

嵌入模式在 IPython 的交互窗口中显示图形,图形显示后不能再修改。

独立窗口模式在弹出的一个窗口中显示图形,图形可以放大、缩小和修改。(独立窗口最后一个按钮是保存图片)

import matplotlib.pyplot as plt # 导入 pyplot 模块并命名为 plt

#以下两句是魔术命令,只能在Ipython里面使用
%matplotlib inline # 设置嵌入模式显示图形
%matplotlib # 设置独立窗口模式显示图形

#Pandas 也可以绘制各类图形,调用形式为 df.plot(kind='图类型')

简单例子

# %matplotlib  设置独立窗口模式 
import numpy as np
import matplotlib.pyplot as plt # 导入 plt
x = np.linspace(-2, 2, 50) # 在区间[-2, 2]内等间距产生 50 个点
y = x**2 # 计算平方值
plt.plot(x,y,color='blue',ls='--',label='y=x^2') # 绘制曲线并设定蓝色、破折线、图例
plt.xlabel('x', fontsize=14) # x 轴标记字符 x
plt.ylabel('y', fontsize=14) # y 轴标记字符 y
plt.title('Example', fontsize=18) # 设置标题
plt.legend() # 显示图例(y=x^2)

中文显示问题

方法 1:每次在程序头部设定中文字体,示例代码如下。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文黑体字体
# 下面的 False 修正坐标轴上负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False 
plt.xlim([-5, 5]) # 测试:坐标轴上负号显示正常
plt.title('中文标题') # 测试:中文标题显示正常

方法 2:修改 Matplotlib 配置文件以显示中文(推荐采用此方法)。此方法可在本机上一劳永逸地解决中文的显示问题,步骤如下。

#1.定位配置文件,找到该文件,打开它
import matplotlib # 导入库
matplotlib.matplotlib_fname() # 显示 matplotlib 配置文件名
#2.找到并修改文件的配置参数
#font.sans-serif : Bitstream Vera Serif, New Century Schoolbook, Century
#修改为:
font.sans-serif : SimHei, Bitstream Vera Serif, New Century Schoolbook, Century
    
#axes.unicode_minus : True
#修改为:
axes.unicode_minus : False
    
#配置后需重启Spyder才可生效

参数

颜色 (color参数表)

red r 红色 
yellow y 黄色
black k 黑色
white w 白色
blue b 蓝色 
green g 绿色
cyan c 青色

线型 (linestyle(ls)参数表)

- 实线 
: 虚线
-- 破折线 
None 空白(不画线) 
-. 点画线

标记符号 (marker参数表)

o 圆圈 
S(小写) 正方形
.* 星号
D 菱形 
d 小菱形
+ 加号 
x X 号 
v(小写) 一角朝下的三角形 
< 一角朝左的三角形
> 一角朝右的三角形 
^ 一角朝上的三角形
None 空白

位置 (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 居中

plt 常用命令

plt.plot() 折线图
plt.grid(True/False) 显示/不显示网格
plt.xlim(0,5) 设置 x 轴范围 
plt.ylim(0,8) 设置 y 轴范围
plt.axis('equal') 设置 x/y 轴单位长度相等 
plt.axis('on/off') 显示/不显示坐标轴
plt.xlabel('x 轴') 设置 x 轴标记文字 
plt.ylabel('y 轴') 设置 y 轴标记文字
plt.title('图标题') 设置图形标题 
plt.legend() 显示图例
plt.text(x,y,'text') 在指定坐标处显示文字 plt.savefig('a.png') 保存图片
plt.figure(figsize=(m,n)) 设置图形大小
plt.style.use('风格') 设置绘图风格
plt.xticks(sign, ['s1','s2','s3','s4','s5'], fontsize=14) # 设置 x 轴标记文字
plt.axes([left,bottom,width,height]) #设置子图位置宽度高度

图形模板

plt.plot() 折线图 
plt.bar() 柱形图
plt.pie() 饼图 
plt.barh() 水平条形图
plt.hist() 直方图 
plt.scatter() 散点图
plt.boxplot() 箱线图

柱形图

上下堆积柱形图用 bottom = plot1(某个柱形图)

左右簇状柱形图用 x + offset(偏移量)

x = []
y = []
plt.bar(x, y)
plt.legend()
#plt.show() 

#水平条形图
plt.barh(x, y, hatch=' ') 
plt.barh(-x, y, hatch=' ')

#限制范围
plt.ylim(0, max)/

#修改x轴标记文字
plt.xticks(x, [], fontsize=14) # 设置 x 轴标记文字

#显示y值
for sx, sy in enumerate(y):
	plt.text(sx, sy+0.03, y, ha='center', fontsize=14)
	
#bar参数
width=宽度
color=内部填充颜色
edgecolor=边缘颜色
hatch=内部填充图案
tick_label=坐标轴标记
label=图例
bottom=以某个plt画出的图为底

饼图

x = [] 	
labels = [] #标签
plt.pie()
plt.legend()

#设置图像大小
plt.figure(figsize=(6,9))

#设置间隔
explode=()

# autopct:百分比数字的显示格式,%.1f%%表示保留一位小数
# shadow:是否有阴影
# startangle:起始角度。默认从 0 度逆时针开始为第一块,此处选择从 90 度开始
patches, ltext, ptext = plt.pie(x, explode=explode, labels=labels,autopct='%.1f%%', shadow=False, startangle=90)

# 设置标注文字大小
for x in ltext:
 x.set_size(20) 
# 设置百分比文字大小
for x in ptext:
 x.set_size(24) 
# 设置 x/y 轴的单位长度相等
plt.axis('equal') 

散点图

模板:

x = []
y = []
arg = np.polyfit(x, y, 系数)
f = np.poly1d(arg)
y2 = f(x)
plt.scatter(x, y, color=' ')
plt.plot(x, y2, color='r') # 再画拟合直线 

example :

#1
np.random.seed(7) # 设置随机种子 7 
x = np.random.uniform(-2, 3, 20)
y1 = 3 * x + 1 + 2 * np.random.random(20) # 生成直线点并加入随机值干扰
arg = np.polyfit(x, y1, 1) # 拟合直线,得到一次多项式的系数
f = np.poly1d(arg) # 利用系数构造拟合一次多项式
y2 = f(x) # 根据拟合的多项式计算 y2 值
plt.scatter(x, y1) # 画原始数据的散点图,见图 9.18
plt.figure() # 产生新图
plt.scatter(x, y1) # 先画原始散点图,见图 9.19
plt.plot(x, y2, color='r') # 再画拟合直线 
plt.text(1, 1, f, fontsize=16) # 在坐标(1,1)处显示拟合的多项式 f

#2
N=20 # 总点数
rng = np.random.RandomState(7) # 一个随机种子为 7 的随机数生成器
x = rng.randn(N) # 生成 N 个标准正态分布小数
y = rng.randn(N)
colors = rng.rand(N)
sizes = 1000 * rng.rand(N) # 点的大小为随机值
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis') 
# 设置点的颜色、大小、透明度、色集
plt.colorbar() # 显示颜色条

#3
import seaborn as sns
iris = sns.load_dataset('iris') # 加载数据集
for x in [0,1]: # 循环 2 次,分别作出花萼、花瓣的散点图
 if x == 0:
 s = '花萼'
 else:
 s = '花瓣'
 plt.figure() # 创建新图
 plt.title('鸢尾花' + s + '长度-宽度散点图', fontsize=18) 
 plt.xlabel(s + '长度', fontsize=16)
 plt.ylabel(s + '宽度', fontsize=16)
 # 下面用字典形式规定三种花的不同标记符号
 for k, v in {'setosa':'^', 'versicolor':'v', 'virginica':'o'}.items():
 d = iris[iris.species==k] # 每次筛选一种花,分三次完成
 plt.scatter(d.iloc[:, 2*x], d.iloc[:, 2*x+1], marker=v, s=120, label=k) 
# 指定不同的 marker
 plt.legend(fontsize=14)

直方图

arr参数必须,其他都是可选参数。

arr = np.random.randn(1000)
bins = [] #可设置一个区间 也可设置一个数字
plt.hist(arr, bins=10, density=0, edgecolor='b', facecolor='cyan', alpha=0.8)
#arr一维数组 bins柱子大小 density 0频数1频率
#edgecolor柱子边线颜色 facecolor直方图颜色 alpha透明度

plt.xticks(fontsize=14) # 设置 x 轴标记文字大小
plt.yticks(fontsize=14) # 设置 y 轴标记文字大小

箱线图

关键的数值点:须线下限值、下四分位数(Q1)、中位数(median)、

上四分位数(Q3)、须线上限值等。

#example
arr = np.random.randn(150) # 生成 150 个标准正态分布的随机小数
arr = np.append(arr, [-3.5, 4.1]) # 特意增加两个离群点
plt.boxplot(arr) # 画箱线图,见图 9.25

arr = [-3, 0, 5, 5, 6, 7, 8, 9] 
print(np.percentile(arr, [25, 50, 75])) # 输出的分位值为[3.75 5.5 7.25]
plt.boxplot(arr, showmeans=True) # True 表示要显示平均值
plt.grid(axis='y') # 显示水平格线
plt.yticks(fontsize=14) # 见图 9.26

#总结 :
#IQR = Q3 - Q1
#min = Q1 - 1.5*IQR
#MAX = Q3 + 1.5*IQR

其他图形

plt.xlim(0,1) # 设 x 轴的坐标区域
plt.ylim(0,1) # 设 y 轴的坐标区域
plt.axhline(y=0.2, xmin=0.1, xmax=0.5, color='g')
# 水平线,x 轴的范围[0.1,0.5]

plt.axhline(y=0.4, xmin=0.2, xmax=0.6, color='r') 
# 水平线,x 轴的范围[0.2,0.6]

plt.axvline(x=0.8, ymin=0.1, ymax=0.4, color='r') 
# 垂直线,y 轴的范围[0.1,0.4]

plt.axvline(x=0.9, ymin=0.2, ymax=0.5, color='b') 
# 垂直线,y 轴的范围[0.2,0.5]

plt.axhspan(ymin=0.6, ymax=0.8, xmin=0.1, xmax=0.5)
# 水平区间带

plt.axvspan(xmin=0.7, xmax=0.8, ymin=0.6, ymax=0.9)
# 垂直区间带

外设

多图绘制

#核心 obj为生成的子图AxesSubplot类型 可使用plt的函数进行格式控制
obj = fig.add_subplot(,, 第几个子图)
obj = plot(x, y)
#简便
# 返回一个 Figure 和一个 2x3 的 axes 数组,sharex/sharey 表示各子图使用同一个 x,y 轴刻度
fig, axes = plt.subplots(nrows=2, ncols=3, sharex=True, sharey=True) 
for m in range(2):
	for n in range(3): # 画 2x3 的随机直方图
 		axes[m, n].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)

# 调整各子图的水平、垂直间距
plt.subplots_adjust(wspace=0.4, hspace=0.6) 

# 直接指定子图的位置
plt.axes([left, bottom, width, height])

#example
x = np.arange(1,100)
fig = plt.figure() # 创建一个 Figure 对象
ax1 = fig.add_subplot(221) # 2 行 x2 列图形的第一个子图
ax1.plot(x, x)
ax2 = fig.add_subplot(222) # 2 行 x2 列图形的第二个子图
ax2.plot(x, -x)
ax3 = fig.add_subplot(223) # 2 行 x2 列图形的第三个子图
ax3.plot(x, x**2)
ax4 = fig.add_subplot(2, 2, 4) # 2 行 x2 列图形的第四个子图
ax4.plot(x, np.log(x))
plt.show() 

设置图形装饰项

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1) # 创建一个 ax 对象
ax.plot(np.random.randn(1000).cumsum()) # 随机数累加并绘制折线图
ticks = ax.set_xticks([0, 250, 500]) # x 轴上只显示 0,250,500 处的刻度
# 将上面三个刻度值用如下三个文字串显示
labels = ax.set_xticklabels(['数据一', '数据二', '数据三'], rotation=30, fontsize=14)
ax.set_title('随机数累加', fontsize=18)
ax.set_xlabel('X 轴', fontsize=18)
ax.set_ylabel('Y 轴', fontsize=18) 

添加注解

Matplotlib 支持 LaTeX 排版标记语言,可以方便地显示分数、根号、极限等各种数学表达式。LaTeX 标记由一对$符号包裹,内部以“\特殊字符串”的形式表达,详细情况可以访问网页https://www.latex-project.org/或 https://matplotlib.org/users/mathtext.html。

#核心
# 定义一个 box 修饰字典,设定各种格式(前景色、边线颜色、边框类型)
box = {'facecolor':'0.75', 'edgecolor':'k', 'boxstyle':'round'}
plt.text(3, 7.5, 'Third', bbox = box) 

# for 循环给每个点加标记
for label, xpos, ypos in zip(labels, x, y): 
 plt.annotate(label, fontsize=16,
 xy=(xpos, ypos), # 指明标记文字的坐标位置,见图 9.36
 xytext=(6, -5), # 但要有轻微偏离;向右(6),向下(-5) 
 textcoords='offset points') # 此属性表示 xytext 是相对 xy 偏离的

#example
plt.text(1, 1.5, 'first') # 在(1, 1.5)处显示 first
plt.text(2, 4.5, 'second') # 在(2, 4.5)处显示 second
plt.annotate('顶部',xytext=(3.5, 1), # 文字位置
xy=(np.pi/2, 1), # 箭头位置的坐标
arrowprops={'facecolor' : 'black', 'shrink' : 0.05}) # 箭头外观

LaTeX表达式

plt.xlim([0, 10])
plt.ylim([0, 10])
plt.text(1, 9, r'希腊字母$\alpha > \beta$', fontsize=14) # LaTeX 语法$标记符号$
plt.text(1, 7, r'下标$\alpha_i > \beta_i$', fontsize=14)
plt.text(1, 5, r'上标$s^2+y^3$', fontsize=14) 
plt.text(1, 3, r'分数 $\frac{2}{3}$', fontsize=14)
plt.text(1, 1, r'平方根 $\sqrt{x^2 + y^2}$', fontsize=14)
plt.text(5, 9, r'求和符号$\sum_{i=0}^\infty x_i$', fontsize=12) 
plt.text(5, 7, r'开 n 次方$\sqrt[3]{x}$', fontsize=16) 
plt.text(5, 5, r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$', fontsize=12)
plt.text(5, 3, r'积分$\int_a^b f(x)\mathrm{d}x$', fontsize=12)

设置坐标轴

def format_spines(): # 将坐标原点设置在图中央 
     ax = plt.gca() # gca 代表当前坐标轴
     ax.spines['right'].set_color('none') # 隐藏坐标轴右侧的边线
     ax.spines['top'].set_color('none') # 隐藏坐标轴顶部的边线
     ax.spines['bottom'].set_position(('data', 0)) # 下边线移到 0 位置,X 轴
     ax.spines['left'].set_position(('data', 0)) # 左边线移到 0 位置,Y 轴
x = np.linspace(-np.pi, np.pi, 100)
plt.plot(x, np.sin(x), color='r', label='sin(x)')
plt.plot(x, np.cos(x), color='b', label='cos(x)')
xlabels = (r'$-\pi$', r'$-\pi/2$', r'$+\pi/2$', r'$+\pi$') # LaTeX 语法
plt.xticks((-np.pi, -np.pi/2, np.pi/2, np.pi), xlabels) # 修改 x 轴刻度显示
plt.yticks([-1, -0.5, 0, 0.5, 1])
plt.legend(loc='upper left') # 见图 9.38
plt.tick_params(axis='both', labelsize=14) # 设定轴上刻度的文字大小
format_spines() # 调用自定义函数设坐标轴

填充颜色和显示图片

fill_between(x 轴区域, y 轴起点,y 轴终点, color='填充色', alpha=透明度)

课外知识

得到子图

#当前的图表和子图可以使用plt.gcf()和plt.gca()获得
ax = plt.gca() #得到子图
ax.plot()

矩形

plt.gca().add_patch(plt.Rectangle((左下角坐标),,))

拟合曲线模板

x = []
y = []
pows = 1
arg = np.polyfit(x, y, pows)
f = np.poly1d(arg)

plt.scatter(x, y)
plt.plot(x, f(x), color='r')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 Python 之 Matplotlib 的总结 的相关文章

  • Python 散点图。标记的大小和样式

    我有一组数据想要显示为散点图 我希望将每个点绘制为大小的正方形dx x 0 5 0 1 0 3 y 0 2 0 7 0 8 z 10 15 12 dx 0 05 0 2 0 1 scatter x y c z s dx marker s 问
  • Python 时间序列聚合

    我有一个像这样的数据框 df project ID country prj start prj end revenue profit 2131 USA 201603 201703 100000 30000 5124 UK 201502 20
  • 通过文档测试、覆盖率和并行性进行 Python 测试发现

    还有一匹小马 不 说真的 我正在寻找一种组织 有效 测试的方法 大多数事情确实有效 但并非所有部分都能组合在一起 这就是我想要的 自动发现测试 这包括文档测试 请注意 文档测试的总和不得显示为单个测试 即不是 py test doctest
  • 如何处理不同版本的python protobuf

    我的python包包含很多由python protobuf Arch Linux上的python2 protobuf 2 5 0 编译的文件 我在Ubuntu服务器12 04 3 有python protobuf 2 4 1 上安装了该包
  • 如何使用python 3.9的typing.Annotation MaxLen?

    我知道有这种新的打字格式Annotated您可以在其中为函数的入口变量指定一些元数据 来自文档 https docs python org 3 library typing html typing Annotated 您可以指定传入列表的最
  • 如何在 Google App Engine 中验证传入电子邮件地址的发件人?

    我正在尝试在 Google App Engine 的 Python SDK 中编写一个基于电子邮件的应用程序 我注意到谷歌允许您通过其 API 接收电子邮件 http code google com appengine docs pytho
  • 如何在 Google App Engine (GAE) 上使用 bcrypt? [复制]

    这个问题在这里已经有答案了 我发现了一个 python 的 bcrypt 库 它似乎非常容易使用 比特加密 1 0 1 https pypi python org pypi bcrypt 1 0 1 安装它并在我的本地计算机上测试 hell
  • 如何根据图像中的对象大小(以像素为单位)来测量现实世界中的对象大小(例如英寸、厘米等)?

    我计算了物体的大小pixel来自包含对象的图像 我想测量现实世界中物体的大小 有没有办法找出乘数来测量实际尺寸 我目前正在使用python以便实施 通常 您将使用相机获取图像 该相机通过镜头将 3 维场景投影到 2 维传感器上 垂直 高度
  • 在 Pandas 中根据多个条件过滤 DataFrame

    对于我的班级 我需要找到虹膜数据集中介于 4 5 和 6 之间的萼片长度 确切的规范是 选择萼片长度大于 4 5 但小于 6 的行 给定的代码 答案应采用这种形式 是 subset data data petal width cm gt 2
  • python selenium 3.0 - 无法识别安装在默认位置的 Firefox 47.0.1。 (壁虎驱动程序)

    以下是我的环境 操作系统 Windows 10 64 家庭版 浏览器 火狐47 0 1 32位 Python 2 7 10 12 64 位 硒 3 0 1 Geckodriver geckodriver v0 11 1 win64 zip
  • 使用Qt5的QWebEngine

    14784 PyInstaller Bootloader 3 x 14784 LOADER executable is C Users Desktop Papinhio player exe dist Papinhio player exe
  • 打字!带有 pyautogui 的字符

    这可以模拟击键 import pyautogui pyautogui typewrite hello world interval 0 1 除了那个 它写道hello world 使用 FR 键盘布局 它写道hello world 使用 E
  • Python 3.4 中的“异步”

    aiohttp 的入门文档提供了以下客户端示例 import asyncio import aiohttp async def fetch page session url with aiohttp Timeout 10 async wit
  • OpenCV:RGB 到 YUV 转换,并显示维基百科等通道

    我一直在寻找这种转换有一段时间了 在Linux上使用Python将RGB图像转换为YUV图像并访问Y U和V通道有哪些方法 使用 opencv skimage 等 更新 我用的是opencv img yuv cv2 cvtColor ima
  • 纯粹依赖 pyproject.toml 有哪些缺点?

    假设您有一个 Python 程序 仅使用它就可以成功打包pyproject toml 有什么缺点 为什么使用setup py or setup cfg在这种情况下 没有 没有什么坏处setup py 只是在某些特定情况下 包装的某些元素无法
  • Tweepy API v2 身份验证

    如何使用 API v2 测试 Tweepy 身份验证 我的下面的代码由于身份验证而无法发布 但是 是否有其他方法可以在不调用发布推文 client create tweet 的情况下测试身份验证 import tweepy bearer t
  • 操作数无法与形状 (128,) (0,) 错误一起广播

    我正在尝试实现面部识别登录系统 但出现错误 操作数无法与形状 128 0 一起广播 我不知道什么或如何解决它 这是我已实现的 view py 和 FaceDetector py 以及我从服务器收到的错误 errors Traceback m
  • PyList_SetItem 与 PyList_SETITEM

    据我所知 PyList SetItem 和 PyList SETITEM 之间的区别在于 PyList SetItem 会降低它覆盖的列表项的引用计数 而 PyList SETITEM 不会 我有什么理由不应该一直使用 PyList Set
  • 底图上的子图

    我有一张英国地图和 121 个地点 每个地点有 3 个值 我想绘制 121 个位置中每个位置的三个值的小条形图 目前 这些值绘制为markersize属性 看起来像这样 密集恐惧症情节 https i stack imgur com 5fv
  • Python 中的安全解除引用

    Groovy 有一个很好的安全取消引用运算符 这有助于避免 NullPointerExceptions variable method The method仅当以下情况时才会被调用variable is not null 有没有办法在 Py

随机推荐