学完Numpy该学matplotlib了,看了看MATLAB入门课,现在看应该非常简单了。
学习资料来自MOOC北理工嵩天老师的Python数据分析与展示,链接放在下面。
在Ubuntu20.04中使用spyder进行学习。
Have fun!
初探matplotlib
引入matplotlib的默认方法:一般来说我们用的最多的是子库pyplot
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.plot([3, 1, 4, 5, 2])
plt.ylabel("grade")
plt.show()
跟matlab比较像,就是调用的函数都是在plt包下的。
ylabel指定y轴名称,show在右侧控制台中显示图像。
保存图像:
savefig(imageName,dpi):第一个参数指定图像名称,第二个指定dpi(dot per inch)图像质量。
指定横纵坐标的区间:
axis:
plt.axis([-1, 10, 0, 6])
x轴-1~10,y轴0~6。
演示:
import matplotlib.pyplot as plt
plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2])
plt.ylabel("grade")
plt.axis([-1, 10, 0, 6])
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZdTEuer-1654179393989)(src/images/test.png)]
plot相关见北邮电子院MATLAB入门
对曲线特征描述也可以使用参数color,marker,linestyle,markerfacecolor,markersize。字符表示时顺序最好是color,marker,linestyle.
plot的中文显示问题及解决方案
对于研究生或者以后要写英文论文而言,基本上没有这方面的困惑,但是平时组会还有工作中这方面存在这方面的需求,了解一下最好。
pyplot默认不支持中文的显示,需要设置rcParams参数:
import matplotlib
import matpotlib.pyplot as plt
matplotlib.rcParams['font.family'] = 'SimHei'
plt.plot([3, 1, 4, 5, 2])
plt.ylabel("纵轴")
pt.show()
rcParams属性:
| attributes | comment |
|---|---|
| ‘font.family’ | 字体名字 |
| ‘font.style’ | 字体风格正常’normal’,斜体’italic’ |
| ‘font.size’ | 字体大小,整数字号或者’large’,‘x-small’ |
family的几个例子,这些中文字体一般需要下载到固定位置:
比如我目前用的是anaconda3的python3.9:
/home/leiyunfei/anaconda3/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf
下载ttf文件后将文件放在这个文件夹下并且删除:
~/.cache/matplotlib
文件夹下的matplotlib缓存。重启spyder就好了。
示例:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 20
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间')
plt.ylabel('纵轴:振幅')
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.savefig('redWave')
plt.show()

在这里遇到一个坑,使用savefig时保存的图片不完整,这是因为savefig有一个参数bbox_inches,默认情况只保存给定区域内的图像,设定bbox_inches则会保存全部图像。
之后这里又遇到一个坑:savefig函数要在show函数之前使用,否则保存的是空白。
**虽然这里设定rcParams可以解决中文的问题,**但是这样会更改全局的属性,这显然不太好,那么还有一种方法,只在需要中文显示的时候使用,更改本次的属性:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.2)
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=20)
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=20)
plt.plot(a, np.cos(2*np.pi*a), 'y-.')
plt.show()
在xlabel,ylabel中修改fontproperties和fontsize来修改本次的中文显示参数。

pyplot的所有文本显示函数
| function | comment |
|---|---|
| plt.xlabel() | 对x轴增加文本 |
| plt.ylabel() | 对y轴增加文本 |
| plt.title() | 图像上方增加文本 |
| plt.text() | 在任意位置增加文本 |
| plt.annotate() | 在图形中增加带箭头的注释 |
实例:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'k--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=25)
plt.text(2, 1, r'$\mu=100$', fontsize=15)
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.savefig('textExample', bbox_inches='tight')
plt.show()

注意:这里的$$中的是Latex风格的行内公式,字符串前面有r代表raw string,屏蔽转义字符。
plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
参数如下:
| attributes | comment |
|---|---|
| text | 注释的文本 |
| xy | 箭头位置 |
| xytext | 文本位置 |
| xycoords | 箭头坐标系统 |
| textcoords | 文本坐标系统,默认与xycoords相同 |
| arrowprops | 箭头属性 |
其中arrowprops中包含属性:
| attributes | comment |
|---|---|
| width | 箭头宽度,单位是点 |
| facecolor | 箭头颜色 |
| shrink | 箭头收缩,单位百分比 |
| headwidth | 箭头头部的宽度 |
| headlength | 箭头头部的长度 |
| 其他很多 |
实例:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'c-.')
plt.xlabel("time", fontsize=15, color='blue')
plt.ylabel("amplitude")
plt.title(r'sin wave $y=cos(2\pi x)$', fontsize=15)
plt.annotate(r'$\mu=100$', xy=(2,1), xytext=(3,1.5),
arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.savefig('annotateExample', bbox_inches='tight')
plt.show()

老师说,掌握到这样就差不多了,有必要再去深挖。
子区域绘图
suplot2grid
subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)
参数解释:
| args | comments |
|---|---|
| shape | 元组,表示想将图分割成什么样的比如(3, 3),将总图化成3*3的 |
| loc | 元组,绘制起始位置,比如(1, 0),从第1行第0列起始 |
| rowspan | 行扩展,占几行,默认1 |
| colspan | 列扩展,占几列,默认1 |
实例:
import matplotlib.pyplot as plt
plt.subplot2grid((3, 3), (0, 0), colspan=3)
plt.subplot2grid((3, 3), (1, 0), colspan=2)
plt.subplot2grid((3, 3), (1, 2), rowspan=2)
plt.subplot2grid((3, 3), (2, 0))
plt.subplot2grid((3, 3), (2, 1))
plt.savefig('subplot2gridEx', bbox_inches='tight')
plt.show()

matplotlib.gridspec
matplotlib下的一个类,用于指明绘制子区域的设计,与subplot结合使用,用gridspec.GridSpec对象代替比如subplot(222)中的222。
实例:
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :-1])
ax3 = plt.subplot(gs[1:, -1])
ax4 = plt.subplot(gs[2, 0])
ax5 = plt.subplot(gs[2, 1])
plt.show()
可以达到相同的效果
一些绘图实例
| funcs | image | funcs | image |
|---|---|---|---|
| boxplot | 箱形图 | contour | 等值图 |
| bar | 条形图 | lines | 垂直图 |
| barh | 横向条形图 | stem | 柴火图 |
| polar | 极坐标图 | scatter | 散点图 |
| pie | 饼状图 | cohere | X-Y相关性函数图 |
| psd | 功率谱密度图 | plot_date | 数据日期图 |
| specgram | 谱图 |
饼状图
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=False, startangle=90)
plt.axis('equal')
plt.show()

一些参数解释:
| args | comment |
|---|---|
| explode | 突出的比例 |
| autopct | 饼中串的字符 |
| startangle | 起始角度,笛卡尔坐标系 |
| shadow | 是否有阴影 |
还有直方图,极坐标图等,就像matlab中的stem,stairs等图,等到用的时候再查资料就好了,没必要细看,反正也记不住。学习嘛,功利一些。
本文介绍了如何使用Python的matplotlib库进行数据可视化,包括基本的plot函数,设置图像的保存质量,调整坐标轴范围,以及解决中文显示问题。此外,还展示了如何使用xlabel、ylabel、title和text等函数添加文本,以及annotate函数创建带箭头的注释。最后,探讨了子区域绘图的 subplot2grid 方法。文章强调了学习matplotlib的重点,并提供了多种图表类型的示例,如pie图和箱形图。
1184

被折叠的 条评论
为什么被折叠?



