为了将数据变成大家喜欢的图形数据,Python提供了matplotlib数据可视化库来绘制各种数据图。
Matplotlib是Python的一个2D绘图库,可以绘制直方图、功率谱、条形图、错误图、散点图等。
1、matplotlib环境搭建
不管你是用Anaconda创建的Python环境,还是独自安装的Python,都可以在相应的Python环境下,输入pip install matplotlib=XX.XX.XX(XX.XX.XX为matplotlib的版本号,不指定默认为最新版)就可以了。安装完在Python环境下输入import matplotlib.pyplot as plt。如果运行不出错,就说明Matplotlib已经安装成功了。
如果上述的安装方法失败的话,可以去Python的官方网站搜索Matplotlib,选择你需要的版本wheel文件就可以了
2、绘制基础
在使用matplotlib绘制图形时,其中有两个最为常用的场景。一个是画点,一个是画线。pyplot的基本方法如下:
方法名 | 说明 |
title() | 设置图表的名称 |
xlabel() | 设置x轴标签 |
ylabel() | 设置y轴标签 |
xticks(x, ticks, rotation) | 设置x轴的刻度,rotation旋转角度 |
yticks() | 设置y轴的刻度 |
plot() | 绘制线性图表 |
show() | 显示图表 |
legend() | 显示图例 |
text(x, y, text) | 显示每条数据的值,x, y值的位置 |
figure(name, figsize(w, h), dpi=n) | 设置图片大小 |
3、绘制一条直线
使用matplotlib绘制图形时,一般的流程如下:
(1)导入matplotlib.pyplot模块,一般习惯命名为plt。pyplot主要主要用于绘制数据图形。
(2)将需要绘制的数据点传递给plt.plot()函数;
(3)通过函数plt.show()打开图形查看器,显示刚刚绘制的图形。
实例:
import matplotlib.pyplot as plt
plt.plot([0, 2], [1, 4])
plt.show()
上图就是按照点(0, 1)(2, 4)来绘制的,也就是说传递给plot的第一个参数是x,第二参数是y。
那么多点绘制就可以是
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.show()
4、设置标签文字和线条粗细
可能你觉得上面的两幅图有点不好看,想优化一下图形,比如设置一下横纵坐标标签、改变线条的粗细、颜色等等。
实例
import matplotlib.pyplot as plt
# 设置标签文字和线条粗细
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 设置线条宽度为5,颜色为红色(red)
plt.plot(x, y, linewidth=5, color='r')
plt.title('Numbers', fontsize=24)
plt.xlabel('datas', fontsize=16)
plt.ylabel('squares', fontsize=16)
plt.show()
在matplotlib中是默认不支持中文显示,如果你设置了中文,就会出现乱码的情况。
那如果想要设置横纵坐标的标签为中文的话,就需要在标签代码前加一行代码:
plt.rcParams['font.sans-serif'] = ['SimHei'] # SimHei 黑体
如
import matplotlib.pyplot as plt
# 设置标签文字和线条粗细
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 设置线条宽度为5,颜色为红色(red)
plt.plot(x, y, linewidth=5, color='r')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title('Numbers', fontsize=24)
plt.xlabel('数据', fontsize=16)
plt.ylabel('平方', fontsize=16)
plt.show()
5、绘制一条一元二次方程的曲线
我们都知道一条曲线是由上千上万个数据点构成的,那么我们在绘制曲线时就是可以使用循环先生成所需的数据点,再传入plot函数,最后调用show函数显示绘制的图形。
import matplotlib.pyplot as plt
# 绘制曲线
x = range(-500, 500)
y = [i**2 for i in x]
plt.plot(x, y, linewidth=3, color='b')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title('y=x**2', fontsize=18)
plt.xlabel('距离(m)', fontsize=12)
plt.ylabel('高度(m)', fontsize=12)
plt.savefig('一元二次曲线图.jpg')
plt.show()
这里使用plt.savefig()保存函数,如果在括号只写文件名不加后缀的话,将会默认保存为PNG格式。
同时,上图我们可以看到解决了中文乱码问题,但是横坐标的负号又出现乱码了。
再加上 plt.rcParams['axes.unicode_minus'] = False 就ok了
6、绘制两条或多条曲线
如果想要在一张图上绘制多条曲线,可以这样搞。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
cos_y = np.cos(x)
plt.plot(x, sin_y, lw=2, c='r', label=r"$\sin(x)$")
plt.plot(x, cos_y, lw=2, c='b', label=r"$\cos(x)$")
plt.legend()
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.title('三角函数曲线', fontsize=18)
plt.title("tilte1", loc="left", fontdict={"size": "xx-large", "color": "r", "family": "Times New Roman"})
plt.title("三角函数曲线", loc="right", size=18, color="c", style="oblique",family="SimHei")
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.show()
plt.legend()函数还有loc、bbox_to_anchor、 ncol、title 、shadow、fancybox等参数
(1)位置参数loc也可以用数字来表示图例的位置
位置参数值 | 位置数值 | 位置参数值 | 位置数值 | 位置参数值 | 位置数值 |
upper right | 1 | upper left | 2 | lower left | 3 |
lower right | 4 | center left | 6 | center right | 5/7 |
lower center | 8 | upper center | 9 | center | 10 |
(2)线框位置参数bbox_to_anchor,它的参数值是一个四元元组,且使用Axes坐标系统。如bbox_to_anchor=(0.05,0.95)。
第一个元素代表距离画布左侧的x轴长度的倍速的距离;
第二个元素代表距离画布底部的y轴长度的倍数的距离;
第三个元素代表元素x轴长度的倍数的线框长度;
第四个元素代表y轴长度的倍数的线框宽度。
注意:当使用线框位置参数bbox_to_anchor时,不建议与loc一起使用。
(3)ncol为展示图例的列数
(4)title为图例的标题
(5)shadow控制线框是否添加阴影
(6)fancybox控制线框是直角还是圆角
如:plt.legend(loc = "upper left", ncol = 2,title = "power function",shadow=True, fancybox=True)
上面展示了plt.title()中参数的两种使用方法。
其中:
位置参数loc可以选择“left”,“center”和“right”。
family控制的是字体类别,
size控制字体大小,
color控制字体颜色,
style控制字体风格。
那如果想将两条线分开,画在同一个画布上,就可以使用plt.subplot()函数。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
cos_y = np.cos(x)
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = Falseplt.subplot(2, 1, 1)
plt.plot(x, sin_y, linewidth=2, color='r', label=r"\\sin(x)sin(x)\\sin(x)sin(x)")
plt.legend(loc=3)
plt.title('三角函数曲线', fontsize=18)
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.subplot(2, 1, 2)
plt.plot(x, cos_y, linewidth=2, color='b', label=r"$\cos(x)$")
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.legend(loc=3)
plt.show()
关注公众号,获取200+本Python、人工智能相关学习资料。