Matplotlib 绘图基础
我们使用 Pandas 千辛万苦处理出来一些数据,却发现,这些数据仍然很抽象。如果没有参与运算,或者对数字不是那么敏感的话,可能一时找不到这里面的规律。这时,我们可以考虑把数据绘制成图表,让其仍容易理解,一目了然。
Matplotlib 用来进行数据的可视化处理,也就是把抽象的数据转换成图像展示出来。
最开始,我们还是要导入各种模块:
import matplotlib.pyplot as plt
import numpy as np
#jupyter中的魔法指令,相当于为我们节约了一行 plt.show代码
#如果绘制的图像不显示,则执行该操作
%matplotlib inline
plt.plot 绘制线性图
线型图是最基本的曲线图了,适用于把规律很明显的数据展现出来
绘制单条线形图
单个直线的绘制
首先,我们需要两组数据,然后对这两组数据绘图:
x = np.linspace(-np.pi, np.pi, num=10)
y = x * 2 + 3.1
plt.plot(x, y)
这是一个线性函数,得到的图像当然是一条直线:
我们也可以绘制二次函数的曲线:
x = x
y = x ** 2
plt.plot(x, y)
得到的曲线就是一个抛物线,因为选的点比较少,所以看起来棱角分明:
绘制多条线形图
我们可以通过指定多组 xy,绘制多条线形图:
x = x
y = 1 - x ** 2
x1 = x - 1
y1 = x1 ** 2
plt.plot(x, y, x1, y1)
就得到两条曲线:
我们也可以通过连续多次调用 plot 实现绘制多条曲线:
plt.plot(x, y)
plt.plot(x1, y1)
结果是一样的:
设置坐标系的比例
在绘图之前配置 plt.figure(figsize=(a,b)),即可设置坐标系的比例。将坐标系等比例放大或者缩小,刻度是不会改变的:
plt.figure(figsize=(10, 10))
plt.plot(x, y)
plt.plot(x1, y1)
我们发现,只是比例变了,也就是图像大小变了,但是坐标范围是不变的:
设置图例
在每个 plot 方法中,通过指定 label 参数设置图例的名称,最后要使用 legend 方法应用图例,显示图像(注意,如果不在最后使用 legend 方法,图例是显示不出来的):
plt.plot(x, y, label='temp')
plt.plot(x1, y1, label='dist')
plt.legend()
显示图例的图像为:
设置轴的标识
我们可以通过设置 xlabel 和 ylabel 属性,指定 x 轴和 y 轴的标识,也可以通过 title 指定标题:
plt.plot(x, y, label='temp')
plt.plot(x1, y1, label='dist')
plt.xlabel('city_tmp')
plt.ylabel('city_dist')
plt.title('temp&dist')
plt.legend()
指定了轴标识和标题的图像为:
图例保存
生成的图像有时候需要保存起来,在其他地方使用。图像保存只需要三步即可:
fig = plt.figure()
,实例化 figure 对象plt.plot(x, y)
,载入图像信息fig.savefig()
,保存图像
用代码表示就是:
fig = plt.figure()
plt.plot(x, y)
fig.savefig('1.png')
图片就保存在了当前目录下。
曲线的样式和风格
曲线颜色
通过 c 参数可以指定曲线的颜色:
plt.plot(x, y, c='red')
这样曲线就是红色的:
我们还可以指定任意 rgb 的颜色:
plt.plot(x, y, c='#a6c0fe')
图像就是我们指定的颜色:
曲线透明度
通过 alpha 参数指定曲线的透明度:
plt.plot(x, y, alpha=0.3, c='red')
可以看到,颜色明显淡很多:
曲线风格
通过 ls 参数指定曲线的风格:
plt.plot(x, y, ls='dotted')
ls 的取值:[‘solid’ | ‘dashed’, ‘dashdot’, ‘dotted’ | (offset, on-off-dash-seq) | '-'
| '--'
| '-.'
| ':'
| 'None'
| ' '
| ''
]
就拿到了点状的曲线:
点风格
通过 marker 参数可以设置点风格:
plt.plot(x, y, marker='8')
marker 的值还可以是 *
、^
等符号。
这样就会把点强调出来:
plt.bar 柱状图
plt.bar()
用来绘制柱状图,参数主要有三个:第一个参数是索引,第二个参数是数据值,第三个参数是条形的宽度。
示例:
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.bar(x, y)
生成的柱状图为:
我们可以指定条形的宽度:
plt.bar(x, y, 0.5)
条形就变细了:
还可以使用 barh 生成横向的条形图:
plt.barh(x, y)
图形就是这样的:
plt.hist 直方图
直方图是一个特殊的柱状图,又叫做密度图,是一定范围内的数字出现的频次。
plt.hist()
的参数:
- bins
可以是一个 bin 数量的整数值,也可以是表示 bin 的一个序列。默认值为10 - normed
如果值为 True,直方图的值将进行归一化处理,形成概率密度,默认值为 False - color
指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,例如DataFrame对象,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色 - orientation
通过设置 orientation 为 horizontal 创建水平直方图。默认值为 vertical
用代码表示就是:
x = [1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 7, 7, 8, 9, 9, 10]
plt.hist(x, bins=20)
生成的直方图为:
plt.pie 饼图
饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小。
pie()
,饼图也只有一个参数 x。
当数据中的数字之和大于 1 时,将绘制出完整的饼图:
arr = [11, 22, 31, 15]
plt.pie(arr)
绘制出的饼图为:
如果数据中数字的和小于 1,则绘制出来的饼图将会是不完整的:
arr = [0.2, 0.3, 0.1, 0.2]
plt.pie(arr)
饼图是有缺口的:
我们可以给每个区块指定标签:
arr = [11, 22, 31, 15]
plt.pie(arr, labels=['a', 'b', 'c', 'd'])
饼图就有标签了:
这些标签太靠外了,我们想要把它们放到图片里面,可以指定 labeldistance 参数,设置标签距离圆心的距离:
arr = [11, 22, 31, 15]
plt.pie(arr, labels=['a', 'b', 'c', 'd'], labeldistance=0.3)
标签就在图片里面了:
我们还可以通过设置 autopct 参数,让饼图中显示每一份占的百分比:
arr = [11, 22, 31, 15]
plt.pie(arr, labels=['a', 'b', 'c', 'd'], labeldistance=0.3, autopct='%.6f%%')
饼图中就出现了百分比:
还可以使用 shadow 参数给饼图加阴影,使用 explode 参数把饼图拆分开:
arr = [11, 22, 31, 15]
plt.pie(arr, labels=['a', 'b', 'c', 'd'], labeldistance=0.3, shadow=True, explode=[0.2, 0.3, 0.2, 0.4])
饼图就有了阴影,也拆开了:
plt.scatter 散点图
- 自变量的变化会导致因变量的变化
- 因变量随自变量而变化的大致趋势
先来创建两个随机数组:
# array([5, 3, 2, 2, 2, 9, 8, 7, 2, 4, 0, 7, 2, 0, 6, 4, 1, 4, 4, 1])
x = np.random.randint(0, 10, size=(20,))
# array([5, 2, 6, 5, 6, 4, 9, 5, 7, 0, 9, 1, 9, 9, 8, 4, 2, 0, 7, 0])
y = np.random.randint(0, 10, size=(20,))
然后,绘制散点图:
随机数的散点图是无规律的。
我们还可以画一下二次函数的散点图:
x = x
y = x ** 2
plt.scatter(x, y, c='rby')
这个图形就很有规律了: