【matplotlib】北理工嵩天老Python数据分析及展示matplotlib部分学习笔记

学完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()

【matplotlib】北理工嵩天老Python数据分析及展示matplotlib部分学习笔记_第1张图片

在这里遇到一个坑,使用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中修改fontpropertiesfontsize来修改本次的中文显示参数。

【matplotlib】北理工嵩天老Python数据分析及展示matplotlib部分学习笔记_第2张图片

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()

【matplotlib】北理工嵩天老Python数据分析及展示matplotlib部分学习笔记_第3张图片

注意:这里的$$中的是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()

【matplotlib】北理工嵩天老Python数据分析及展示matplotlib部分学习笔记_第4张图片

老师说,掌握到这样就差不多了,有必要再去深挖。

子区域绘图

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】北理工嵩天老Python数据分析及展示matplotlib部分学习笔记_第5张图片

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()

【matplotlib】北理工嵩天老Python数据分析及展示matplotlib部分学习笔记_第6张图片

一些参数解释:

args comment
explode 突出的比例
autopct 饼中串的字符
startangle 起始角度,笛卡尔坐标系
shadow 是否有阴影

还有直方图,极坐标图等,就像matlab中的stem,stairs等图,等到用的时候再查资料就好了,没必要细看,反正也记不住。学习嘛,功利一些。

你可能感兴趣的:(python,数据分析,学习)