前言
前面博主介绍过的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一样都可以使用,这段代码就实现了横行柱状图,实现效果如下: