Matplotlib 图形绘制
一、线型图
线型图是学习matplotlib绘图的最基础案例。
import numpy as np
import matplotlib.pyplot as plt
下面我们将两条曲线绘制到一个图形里:
plt.figure()
x = np.linspace(-10,10,200)
plt.plot(x, x**2)
plt.plot(x, x**3)
plt.show()
可以看到这种方式下,两个线条共用一个坐标轴,并且自动区分颜色。
plot方法的核心是plot(x,y),x表示横坐标值的序列,y表示x某个坐标对应的y值,实际上就是y=f(x)函数。当只提供y的时候,x默认使用0-n的整数序列。这里的序列必然是个有限的点集,而不是我们想象中的无穷个点组成一条线。如果你的点很稀疏,那么图形看起来就像折线,如果点很多,看起来就比较圆滑,形似曲线。
二、散点图
与线型图类似的是,散点图也是一个个点集构成的。但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来。
-
用plt.plot画散点图
x = np.linspace(0,10,30)
y = np.sin(x)
plt.plot(x,y,'bo', ms=5)
plt.show()
代码和前面的例子差不多,为什么这里显示的却是散点图而不是sin曲线呢?这是因为一是点集比较少,稀疏,才30个;二是没有指定线型。
- 用plt.scatter画散点图
scatter专门用于绘制散点图,使用方式和plot方法类似,区别在于前者具有更高的灵活性,可以单独控制每个散点与数据匹配,并让每个散点具有不同的属性。
一般使用scatter方法,如下例子就可以了:
plt.scatter(x, y, marker='o')
下面看一个随机不同透明度、颜色和大小的散点例子:
rng = np.random.RandomState(10)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000* rng.rand(100)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.3)
plt.colorbar() # 绘制颜色对照条
plt.show()
主要参数说明:
- x,y:输入数据
- s:点的大小,以像素为单位
- c:颜色
- marker:点的样式
- alpha:透明度
- linewidths:线宽
- edgecolors :边界颜色
在处理较少点集的时候scatter方法灵活度更高,可单独配置并渲染,但所需消耗的计算和内存资源也更多。当数据成千上万个之后,plot方法的效率更高,因为它对所有点使用一样的颜色、大小、类型等配置,自然更快。
三、直方图
使用hist方法来绘制直方图:
plt.figure()
salary = [1050, 2000, 3500, 3000, 4000, 3200, 5000, 4300, 6000]
group = [1000, 3000, 5000, 7000]
plt.hist(salary, 4)
plt.show()
绘制直方图,最主要的是一个数据集data和需要划分的区间数量bins,另外你也可以设置一些颜色、类型参数:
plt.hist(np.random.randn(1000), bins=30,normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')
histtype直方图的类型,可以是'bar'、 'barstacked'、'step'和'stepfilled'。
除了一维的直方图,还可以使用hist2d方法绘制二维的直方图:
mean = [0,0] # 忽略数据的创建过程
cov = [[1,1],[1,2]]
x,y = np.random.multivariate_normal(mean, cov,10000).T
plt.hist2d(x,y,bins=30,cmap='Blues') #以蓝色为基调
cb = plt.colorbar() # 插入颜色条
cb.set_label('counts in bin') # 设置颜色条的标签
plt.show()
hist2d是使用坐标轴正交的方块分割区域,还有一种常用的方式是正六边形也就是蜂窝形状的分割。Matplotlib提供的plt.hexbin就是满足这个需求的:
plt.hexbin(x,y,gridsize=30, cmap='Blues')
plt.colorbar(label='count in bin')
plt.show()
四、柱状图
柱状图,也被称作条形图,看起来像直方图,但完全是两码事。条形图根据不同的x值,为每个x指定一个高度y,画一个一定宽度的条形;而直方图是对数据集进行区间划分,为每个区间画条形。
plt.figure()
x = [1, 2, 3]
y = [1000, 2000, 3000]
plt.bar(x, y, color=['r', 'g', 'b'])
for x, y in zip(x, y):
plt.text(x, y + 20, y, ha='center', fontsize=12)
plt.show()
n = 12 # 12组数据
X = np.arange(n)
Y1 = (1 - X / n) * np.random.uniform(0.5, 1.0, n) # 生成对应的y轴数据
Y2 = (1 - X / n) * np.random.uniform(0.5, 1.0, n)
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white') # +号让所有y值变成正数
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white') # 负号让所有y值变成复数
# 加上数值
for x, y in zip(X, Y1): # 显示文本
plt.text(x, y + 0.05, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x, -y - 0.05, '-%.2f' % y, ha='center', va='top')
plt.xlim(-0.5, n)
plt.ylim(-1.25, 1.25)
plt.show()
将上面的代码稍微修改一下,就可以得到下面的图形:
plt.bar(X, Y1, width=0.4, facecolor='lightskyblue', edgecolor='white')
plt.bar(X+0.4, Y2, width=0.4, facecolor='yellowgreen', edgecolor='white')
for x,y in zip(X,Y1):
plt.text(x, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
for x,y in zip(X,Y2):
plt.text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
plt.xlim(-0.5,6)
plt.ylim(0,1.25)
plt.show()
五、饼图
通过pie方法,可以绘制饼图:
labels = '狗', '猫', '仓鼠', '乌龟'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
plt.axis('equal') # 设置x轴和y轴均等
plt.show()
主要参数说明:
- x:输入的数据数组
- explode:数组,可选参数,默认为None。 用来指定每部分从圆中外移的偏移量。 例如:explode=[0,0.2,0,0],第二个饼块被拖出。
- labels:每个饼块的标记
- colors:每个饼块的颜色
- autopct:自动标注百分比,并设置字符串格式
- shadow:是否添加阴影。
- labeldistance:被画饼标记的直径。
- startangle:从x轴逆时针旋转饼图的开始角度。
- radius:饼图的半径
- counterclock:指定指针方向,顺时针或者逆时针。
- center:图表中心位置。
x = [1000, 2000, 3000]
explode = [0.01, 0.1, 0.01] # 圆心距
label = ['a', 'b', 'c']
plt.figure(figsize=(6, 6))
plt.pie(x, explode=explode, labels=label, autopct='%1.1f%%', colors=['r', 'y', 'c'], labeldistance=0.8, pctdistance=0.5)
plt.show()
六、雷达图
一般在处理数据时,要绘制出一组数据中的多个标签的值,matplotlib为我们提供了雷达图来进行绘制。通过polar方法,即可绘制雷达图:
plt.figure()
dataLength = 5 # 把整个圆切成5份
angles = np.linspace(0, 2 * np.pi, dataLength, endpoint=False)
labels = ['生存', '输出', '发育', '团战', 'KDA']
data = [2, 3.5, 4, 4.5, 5]
arr1 = np.array([angles[0]])
angles = np.concatenate((angles, arr1))
data.append(data[0])
plt.polar(angles, data, color='r', marker='o')
plt.xticks(angles[:-1], labels)
plt.show()
七、箱线图
箱线图也称箱须图,其绘制需使用常用的统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同特征时,更可表现其分散程度差异。箱线图利用数据中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据,它也可以粗略地看出数据是否具有对称性、分布的分散程度等信息,特别可以用于对几个样本的比较。matplotlib中提供了boxplot方法来对箱线图进行绘制。
plt.figure()
plt.rcParams['font.sans-serif'] = 'STKAITI'
plt.rcParams['axes.unicode_minus'] = False
# 绘图及修饰
# 绘制箱线图
x = values[:, 3:6]
plt.boxplot(x,
notch=True,
sym='*',
vert=True,
widths=0.5,
labels=['a', 'b', 'c'],
meanline=True,
showmeans=True
)
plt.show()
主要参数说明:
·x:接收array。表示用于绘制箱线图的数据,无默认。
·notch:接收Boolean。表示中间箱体是否有缺口,缺口大小为置信区间。默认为None。
·sym:接收特定string。指定异常点形状,默认为None。
·vert:接收boolean。表示图形是横向或者纵向。默认为None。
·positions:接收array。表示图形位置。默认为None。
·widths:接收scalar或array。表示每个箱体的宽度。默认为None。
·labels:接收array。指定每一个箱线图的标签。默认为None。
·meanline:接收Boolean。表示是否显示均值线。默认为False。meanline和showmeans同时为true时,可以显示均值线。