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时,可以显示均值线。

posted @ 2020-04-24 10:18  如心幻雨  阅读(591)  评论(0编辑  收藏  举报