Python绘图库matplotlib实战:让数据可视化

前言

现在最火的语言莫过于Python语言,它能用简短的代码实现其他语言非常复杂的功能,比如说博主介绍过的pandas库,而今天介绍的matplotlib库能和pandas库结合起来,让数据更加的直观,易懂。

Matplotlib 是 Python 的一个绘图库。它包含了大量的工具,你可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形。好了,下面我们直接进入实战代码学习。

折线图

首先,就是我们图标之中常用的折线图,对于折线图来说,能直观的看到数据的涨跌变化,比如股市常用的图形就是折线图,下面我们来看看代码如何实现:

import matplotlib.pyplot as plt

x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
plt.plot(x, y)
plt.show()

代码非常简单,就是确定X,Y轴的数据,然后显示出来,这段代码显示的效果如下:

折线图当然这是折线图的基本,也是最简单的玩法, 其实对于matplotlib库来说,折线图还有很多的玩法,比如可以修改折线的颜色,折现的样式等,直接上代码:

plt.plot(x, y,'r--')

仅仅只修改这一句就行,r代表虚线的颜色为红色, ‘–’代表折线的样式为–,显示效果如下图所示:
红色折线图这是最简单的用法,为了便于理解后面的知识点,这里开始深入展开,比如先明确Figure的概念,我们先来看一张图:
在这里插入图片描述图片上,Figure代表画板,Axes/Subplot代表画纸,其他两个英文就是X轴与Y轴,所以假如我们需要在一张画纸上画4个折线图就需要用到这些知识点,代码如下:

x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 获取画板
ax1 = fig.add_subplot(221)  # 获取画纸
ax1.plot(x, y)
ax2 = fig.add_subplot(222)  # 获取画纸
ax2.plot(x, y)
ax3 = fig.add_subplot(223)  # 获取画纸
ax3.plot(x, y)
ax4 = fig.add_subplot(224)  # 获取画纸
ax4.plot(x, y)
plt.show()

这里我们创建了画板,同时创建了画纸,这里设置为两行行列的画板,同时分别获取某个位置的画纸,这样我们就能画出4个折线图,显示效果如下:
在这里插入图片描述

折线图的详细用法

如果使用如上方式先创建画板在获取画纸进行画图的话,我们如何设置其他的参数呢?下面我们直接来看一段代码:

matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
ax.plot(x, y, linestyle='--', marker='o')#设置X,Y数据,显示折现的样式(--),以及数据点的样式(圈)
ax.set_title("我的标题")  # 设置你的标题
ax.set_xlabel('X轴')  # 设置X轴的文字
ax.set_ylabel('Y轴')  # 设置Y轴的文字
ax.set_xticks(['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08'])  # 更改X轴刻度
ax.set_xticklabels(['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08'],
                   rotation=30, fontsize='small')  # 增加X轴刻度文字旋转角度以及字体大小
ax.grid()#增加网格
ax.tick_params(axis='x', labelsize=7, rotation=45, colors='red')#同样可以设置X轴字体样式旋转角度,文字颜色,第一个参数为哪个轴
for i, j in zip(x, y):
    ax.annotate('%s' % (j), xy=(i, j), xytext=(0, 15), textcoords='offset points', ha='center')
#将详细数据显示在折线图上,
#第一个参数为注释点显示的数据,第二参数为数据显示图中的哪个坐标
# textcoords注释文本的坐标系属性,默认与xycoords属性值相同,也可设为不同的值。除了允许输入xycoords的属性值,还允许输入以下两种:
# offset points相对于被注释点xy的偏移量(单位点)
# offset pixels相对于被注释点xy的偏移量(单位像素)
#第四个参数显示的文字在中间
plt.show()

上面基本把常用的方法全部都写在了代码中,而且注释已经写的非常的详细,这里博主不在过多的赘述,上面代码显示的效果图如下:
折线图

柱状图

除了生活中常见的折线图之外,我们还常常见到各种报表中,也有柱状图,同样柱状图也可以通过matplotlib包实现,下面我们先来看一个简单的用法:

x = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08']
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
ax.bar(x, y)
plt.show()

在matplotlib中,我们通过bar实现柱状图,而之前的折现图我们通过plot方法实现,上面是最简单的实现方式,实现效果图如下:
柱状图

柱状图的详细用法

接着,我们同样深入了解柱状图,看看如何实现,让其效果更佳,同样,我们先来看一段代码:

import matplotlib.pyplot as plt
import matplotlib.colors as col
import matplotlib.cm as cm
import matplotlib
import numpy as np
#下面三行用处为避免中文乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
x = [2000, 2005, 2010, 2015, 2020, 2025, 2030, 2035]
y = [0, 15, 23, 68, 45, 86, 54, 24]
y2 = [0, 10, 20, 60, 40, 80, 50, 20]
fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
ax.bar([i + 1 for i in x], y2)
ax.set_title("柱状图")
ax.set_xlabel("X数据")
ax.set_ylabel("Y数据")
ax.grid()#增加网格
ax.tick_params(axis='x', labelsize=7, rotation=45, colors='red')
#annotate对齐方式
#arrowprops绘画箭头
for i, j in zip(x, y):
    ax.annotate('%s' % (j), xy=(i, j), xytext=(0, 25), textcoords='offset points', ha='center',
        arrowprops=dict(facecolor='black', shrink=0.15), fontsize=7)
patterns = {'-', '+', 'x', '\\', '*', 'o', '0', '.', 'v', '^', '1', '2', '3', '4', '8', 's', 'p', 'h'}#柱形图的样式
#cm.ScalarMappable给定的颜色映射返回RGBA颜色之前使用数据标准化
#colors.Normalize使用方法如下:
# class matplotlib.colors.Normalize(vmin=None, vmax=None)
# 参数vmin、vmax分别为要设置的数据范围最小值和最大值;
# 范围外的值分别显示最大值或最小值的颜色。
#cm.hot表示风格
camp1 = cm.ScalarMappable(col.Normalize(min(y), max(y) + 20), cm.hot)
#edgecolor:柱子轮廓色
#color:柱子填充色
#camp1.to_rgba(y)返回颜色值
bars = ax.bar(x, y, alpha=0.5, color=camp1.to_rgba(y), edgecolor='red', label=u'柱形图')
for bar, pattern in zip(bars, patterns):
    bar.set_hatch(pattern)#设置每个柱形的填充样式
ax.legend(loc='upper left')#左上角的提示
plt.show()

折现图的某些方法,在柱状图中依然可以使用,而且上面代码也有柱状图独有的方法函数,其中一些都写了注释,方便大家阅读,上面这段代码显示的效果如下:
柱状图当然柱状图并不仅仅只有竖着的才是柱状图,有时候我们也可以看到许多横着的柱状图,那么横着的柱状图在matplotlib中是如何实现的呢?还是一样直接看一段代码:

x = [2000, 2005, 2010, 2015, 2020, 2025, 2030, 2035]
y = [0, 15, 23, 68, 45, 86, 54, 24]
fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
ax.barh(x, y)
plt.show()

代码很简单,就是把bar方法换成barh方法,而且上面bar能用的其他设置barh一样都可以使用,这段代码就实现了横行柱状图,实现效果如下:
横柱状图

饼图

折线图可以看清楚数据的走势涨跌以及升迁,柱状图可以看清楚高低长短以及大小,但是它们都无法确认数据的百分比分布情况,所以这个时候就需要饼图,我们先来看一看饼图的简单用法:

fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
labels = ['娱乐', '育儿', '饮食', '房贷', '交通', '其它']
sizes = [2, 5, 12, 70, 2, 9]
plt.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=False, startangle=150)
plt.title("饼图示例-8月份家庭支出")
plt.show()

在matplotlib包中,我们使用饼图的方法是pie,而且百分比也不用我们自己来计算,pie方法会自动帮我们计算数组的综合,然后在分别每个数占据的比例,上面的代码显示效果如下:
饼图

饼图的详细用法

同样上面都是一些最基本的用法,我们实际的项目中可能还需要饼图的其他各种详细的设置,所以,我们先来看看饼图详细用法的一些代码:

fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
labels = ['娱乐', '育儿', '饮食', '房贷', '交通', '其它']
sizes = [2, 5, 12, 70, 2, 9]
explode = (0,0,0,0.1,0,0)
'''
x:指定绘图的数据;
explode:指定饼图某些部分的突出显示,即呈现爆炸式;
labels:为饼图添加标签说明,类似于图例说明;
colors:指定饼图的填充色;
autopct:自动添加百分比显示,可以采用格式化的方法显示;
pctdistance:设置百分比标签与圆心的距离;
shadow:是否添加饼图的阴影效果;
labeldistance:设置各扇形标签(图例)与圆心的距离;
startangle:设置饼图的初始摆放角度;
radius:设置饼图的半径大小;
counterclock:是否让饼图按逆时针顺序呈现;
wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;
textprops:设置饼图中文本的属性,如字体大小、颜色等;
center:指定饼图的中心点位置,默认为原点
frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;
'''
plt.pie(sizes,explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
'''
legend画出右上角显示的颜色文字配对详情
loc:图例所有figure位置
bbox_to_anchor:指定图例在轴的位置
fontsize:文字大小
borderaxespad:轴与图例边框之间的距离
frameon:是否去掉图例边框,false代表是
edgecolor:设置图例边框颜色
facecolor:设置图例背景颜色,若无边框,参数无效
handletextpad:图例句柄和文本之间的间距
handlelength:图例句柄的长度
handleheight:图例句柄的高度
labelspacing:图例条目之间的垂直间距
borderpad:图例边框的内边距
framealpha:控制图例框架的 Alpha 透明度
shadow:控制是否在图例后面画一个阴影
'''
ax.legend(loc='best', bbox_to_anchor=(1.1, 1.05), fontsize=8, borderaxespad=0.3,labelspacing=2.0)
plt.title("饼图示例-8月份家庭支出")
plt.show()

上面都是饼图常用的参数,其中有些参数并不是饼图用的所以这里没有讲解,因为legend有很多参数,而且大部分还是散点图用的参数,我们将马上讲解散点图,我们看看上面代码实现的效果图:
详细用法

散点图

以上三种图都是我们生活中常见的图,比如财务报表,理财开支,生活贷款以及科学计算都会用到上面三种图形,但是有一种图是科学计算中独用的,那就是散点图,生活中基本见不到这种图,但从事科学研究的大佬肯定经常用到,下面我们来看看它的简单用法:

fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y)
plt.show()

在matplotlib包中,散点图的方法是scatter,上面的代码我们使用numpy库随机生成了1000具有标准正态分布的数据,定位X,Y的坐标,然后显示出来,显示的效果如下图所示:
散点图

散点图的详细用法

当然这是散点图最基本的用法,下面我们来看看散点图的详细用法,这里我们不和上面一样笼统的代码注释讲解,我们将分别讲解散点图的方法参数,首先也就是我们创建散点图的方法scatter它的参数:

scatter(x, y, s=None, c=None, marker=None, 
cmap=None, norm=None, vmin=None, 
vmax=None, alpha=None, linewidths=None, 
verts=None, edgecolors=None, 
hold=None, data=None, **kwargs)

参数的意思分别如下:

    x,y:数据坐标
    
    s:原点的大小,也需要是一个list数组的类型,设置每个点的大小
    
    c:颜色,可以单独设置(单独设置传入list数组),可以整体设置
    
    marker:`〜matplotlib.markers.MarkerStyle`,可选,默认值:'o'
        请参阅`〜matplotlib.markers`以获取有关不同的更多信息
        标记分散支持的样式。 `marker`可以是
        该类的实例或特定文本的简写
        标记。
    
    cmap:`〜matplotlib.colors.Colormap`,可选,默认:无
        一个`〜matplotlib.colors.Colormap`实例或注册名称。
        `cmap`仅在`c`是浮点数组时使用。如果没有,
        默认为rc`image.cmap`。
    
    norm:`〜matplotlib.colors.Normalize`,可选,默认:无
        `〜matplotlib.colors.Normalize`实例用于缩放
        亮度数据为0,1。`norm`只有在`c`是一个数组时才被使用
        彩车。如果`None',则使用默认值:func:`normalize`。
    
    vmin,vmax:标量,可选,默认值:无
        `vmin``vmax``norm`结合使用来标准化
        亮度数据。如果其中任何一个都是`无',那么最小和最大的
        使用颜色数组。请注意,如果你通过一个“规范”实例,你的
        `vmin``vmax`的设置将被忽略。
    
    alpha:透明度
    
    linewidths:标量或array_like,可选,默认值:无
        如果无,则默认为(lines.linewidth,)。
    
    verts:(x,y)的序列,可选
        如果`marker`为None,这些顶点将用于
        构建标记。标记的中心位于
        在(0,0)为标准化单位。整体标记重新调整
        由``s``完成。
    
     edgecolors :边框颜色

比如我下面这段代码设置了每个点的大小,颜色,边框,透明度,样式为右尖三角形。代码如下:

fig = plt.figure()  # 获取画板
ax = fig.add_subplot(111)  # 获取画纸
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
color = ['r', 'y', 'k', 'g', 'm', 'r', 'y', 'k', 'g', 'm']
plt.scatter(x, y, color=color, marker='>',
            s=s, edgecolor='black', alpha=0.5)
for x, y in zip(x, y):
    plt.annotate('(%s,%s)' % (x, y), xy=(x, y), xytext=(0, -10), textcoords='offset points', ha='center', va='top')
plt.show()

可以看到我们设置的点其实都在一条直线上,而且我们也同样使用了annotate方法,标记点的坐标显示在图像上,前面的有些方法,在散点图中依旧可以用,包括legend方法,这段代码显示的效果如下:
散点图对角线对于matplotlib包常用的绘图操作来说,上面基本都讲解到了,其他的都是一些比较偏门的知识,感兴趣的可以查询文档更深入的了解,但学会了上面的绘图代码,基本上大多数情况下都能轻松应付自如,好了matplotlib库就讲解到这里,觉得有用的可以点个赞支持一下,谢谢。

发布了112 篇原创文章 · 获赞 145 · 访问量 107万+

猜你喜欢

转载自blog.csdn.net/liyuanjinglyj/article/details/104186389