目录
在完成数据收集和统计工作之后,我们可以利用Matplotlib库将数据进行可视化展示,最后得到的结果不但美观,还可以让人们非常直观快速的从数据中获取信息。
通过Matplotlib绘制各类图形
Matplotlib库中封装了绘制各类图表的方法,通过设置参数还可以对图标进行修改。
绘制折线图
代码如下:
# -*- codeing = utf-8 -*-
from matplotlib import pyplot as plt
import matplotlib
import numpy as np
#通过Numpy设置x轴和y轴的坐标
x = np.arange(1,6,1)
y = np.array([5,7,18,2,10])
#通过plot方法绘制折线图
plt.plot(x,y)
#通过show方法展示
plt.show()
plot方法的作用是通过传入的x和y绘制折线图,调用show方法将其展现出来。最后绘制出来的图片如下:
绘图时的通用属性参数
在没有设置相关的参数时绘制出来的图片是Matplotlib库的默认方式,下面给出绘图常用的几个参数。
属性名 | 含义 |
color | 线条颜色 |
linewidth | 线条宽度 |
linestyle | 线条样式 |
marker | 标记方式 |
alpha | 透明度(0到1) |
代码如下:
# -*- codeing = utf-8 -*-
from matplotlib import pyplot as plt
import matplotlib
import numpy as np
x = np.arange(5)
plt.plot(x, x*0.5, color='#ff0011', linewidth='5', linestyle='-', alpha=0.5)
plt.plot(x, x, color='red', linewidth='2', marker='o')
plt.plot(x, x*2, color='blue', linewidth='1', marker='v')
plt.show()
三条直线分别采用了不同的颜色(color)、线条宽度(linewidth)、线条样式(linestyle)、标记方式(marker)、透明度(alpha),图片如下:
绘制柱状图
方法为matplotlib.pyplot.bar()
下面是芳芳各科考试分数的柱状图:
代码如下:
# -*- codeing = utf-8 -*-
from matplotlib import pyplot as plt
x = [1,2,3,4]
y = [66,95,100,82]
width = [0.2,0.8,0.4,1]
color = ['red','pink','blue','green']
x_label = ['class1','class2','class3','class4']
#绘制x刻度标签
plt.xticks(x,x_label)
#绘制柱状图
plt.bar(x, y, color=color, width=width, edgecolor='black')
plt.show()
bar方法与plot方法参数用法基本一致,在这里edgecolor表示的是条柱边缘的颜色。为了能够更好的对应到各个科目,利用了xticks方法给x轴指定了标签,让条状图与科目直接对应起来。
绘制饼图
饼状图可以帮助我们更加直观的观察到某一项数据在总体中所占的百分比,绘制 方法为matplotlib.pyplot.pie(),该方法常用参数如下表:
参数 | 含义 |
label | 该块饼图的说明 |
sizes | 每个统计项的数字 |
explode | 该块饼图离开中心的距离 |
radius | 半径 |
color | 颜色 |
startangle | 起始角度 |
下面是芳芳一个月的支出情况:
根据饼状图我们很容易可以看出来,芳芳是一个注重于穿衣的吃货。代码如下:
# -*- codeing = utf-8 -*-
from matplotlib import pyplot as plt
items = ['food','education','clothes','phone','others']
sizes = ['1200','200','500','200','400']
explode = [0,0.1,0.1,0.1,0.1]
colors = ['blue','red','yellow','green','orange']
plt.pie(sizes, explode=explode, labels=items, startangle=25, colors=colors)
plt.show()
绘制直方图
直方图不同于柱状图,直方图的中间是没有空隙的,一般用来表示区间中数据的分布情况。绘制直方图的方法为pyplot.hist(),常用参数如下表:
参数 | 含义 |
x | 对应x轴 |
bins | 柱状图个数 |
histtype | 直方图形状,默认为bar |
align | 控制柱状图的水平分布 |
color | 颜色 |
density | 展示频数/频率统计结果 |
label | 标签 |
下面是某班某次考试统计:
代码如下:
# -*- codeing = utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
#分数
x = [99,86,45,64,89,90,76,95,97,99,92,83,84]
#直方图分布区间
bins = np.arange(50,101,10)
#绘制直方图
plt.hist(x, bins=bins, color='orange')
plt.show()
设置坐标的技巧
为了让图标看起来更加简单,我们还可以设置一些坐标轴的相关信息。
使用中文展示坐标轴标签
我们再来看看这幅图:
是不是比刚才简单了许多?
代码如下:
# -*- codeing = utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
#分数
x = [99,86,45,64,89,90,76,95,97,99,92,83,84]
#直方图分布区间
bins = np.arange(50,101,10)
#绘制直方图
plt.hist(x, bins=bins, color='orange')
#设置中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.xlabel('分数')
plt.ylabel('人数')
plt.show()
要注意,如果在图表中要使用中文,都必须加上plt.rcParams['font.sans-serif'] = ['SimHei']
设置坐标的范围
有时候我们为了更加清楚的观察某个范围内数据的变化,还可以通过xlim和ylim方法设置坐标的范围。
代码如下:
# -*- codeing = utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10,11,1)
plt.plot(x,2*x)
#设置坐标范围
plt.xlim(-2,2)
plt.ylim(-5,5)
plt.show()
设置主刻度和次刻度
为了使坐标轴上的刻度更加美观,可以设置主次刻度,同时也方便观察。
代码如下:
# coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
xmajorLocator = MultipleLocator(2) # 将x轴主刻度设置为2的倍数
xmajorFormatter = FormatStrFormatter('%1.1f') # 设置x轴标签的格式
xminorLocator = MultipleLocator(0.5) # 将x轴次刻度设置为0.5的倍数
ymajorLocator = MultipleLocator(0.2) # 将y轴主刻度设置为0.2的倍数
ymajorFormatter = FormatStrFormatter('%1.2f') # 设置y轴标签的格式
yminorLocator = MultipleLocator(0.1) # 将y轴次刻度设置为0.1的倍数
x = np.arange(0, 10, 0.1)
#设置子图,在ax里设置坐标轴刻度
ax = plt.subplot(111)
# 设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)
# 显示次刻度标签的位置
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)
y = np.cos(x) # 绘图
plt.plot(x,y)
plt.show()
设置并旋转坐标刻度文字
之前的一些范例当中,坐标轴上都是数字,但是在某一些场景当中需要用到文字。下图是一个股票收盘价折线图,x轴代表日期。为了不让文字都挤到一起,可以将其按一定角度旋转。
代码中通过xticks方法设置了x轴每个刻度展示的文字,并通过参数rotation设置旋转角度。
# -*- codeing = utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
#折线图
x = np.array([1,2,3,4,5])
y = np.array([21,20.5,21.6,21.8,22])
plt.xticks(x,('20210715','20210716','20210717','20210718','20210719'),rotation=30)
plt.yticks(np.arange(20,22.5,0.2))
plt.ylim(20,22)
#设置中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.xlabel("日期")
plt.ylabel("收盘价")
plt.plot(x,y,color='red')
plt.show()
增加可视化美观效果
通过设置图例的标题和网格等效果,数据会更加直观。
设置图例
通过plt.legend方法来设置图例及其位置。
数值参数值 | 字符产参数值 | 图例位置 |
0 | best | 最合适的位置 |
1 | upper right | 右上角 |
2 | upper left | 左上角 |
3 | lower right | 右下角 |
4 | lower left | 左下角 |
5 | right | 右侧 |
6 | center left | 左侧中间 |
7 | center right | 右侧中间 |
8 | lower center | 下侧中间 |
9 | upper center | 上侧中间 |
10 | center | 中间 |
图示如下:
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-3,4)
plt.xlim(-3,3)
plt.plot(x,x,color="green",label='y=x')
plt.plot(x,2*x,color="yellow",label='y=2x')
plt.plot(x,3*x,color="blue",label='y=3x')
plt.legend(loc='2') #绘制图例
plt.show()
设置中文标题
通过设置标题,可以直接获取图表所要表达的内容。下图直接看图表就知道说的是芳芳的月支出占比。
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
items = ['吃','教育','衣服','化妆品','其它']
sizes = [5000,2000,1000,3000,1000]
explode = (0,0.1,0.1,0.1,0.1)
colors=['blue','red','green','yellow','#ff00ff']
plt.pie(sizes,explode=explode,labels=items,startangle=30,colors=colors)
plt.rcParams['font.sans-serif']=['SimHei']#设置中文
#s设置标题
plt.title("芳芳本月开支",fontsize='large',fontweight='bold',verticalalignment ='center')
plt.show()
设置网格效果
有时候因为变量较多,坐标轴单位小导致不容易看清楚数据到底对应到了多少,这时候就可以用grid方法引入表格。
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
x=[1,2,3,4]# x轴刻度
y=[80,70,75,85]#y轴刻度
color=['red','green','blue','orchid']
x_label=['一班','二班','三班','四班']
#绘制x刻度标签
plt.xticks(x, x_label)
plt.rcParams['font.sans-serif']=['SimHei']#设置中文
#s设置标题
plt.title("班级平均分对比表")
#绘制柱状图
plt.bar(x, y,color=color)
plt.grid(linewidth='1',color='yellow',alpha=0.5)
plt.show()
目录
设置多图和子图效果
在绘制各种报表的时候,有时候需要同时展示多张图对比,有时候也需要在一张大图中绘制子图,这就需要通过figure对象等方式。
通过figure对象同时绘制多张图
通过figure对象可以绘制一块白板,下面是其构造方法。
figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)
- num:当前图形的编号名称
- figsize:宽度和高度
- dpi:分辨率,默认为80
- facecolor:背景颜色
- edgecolor:边界颜色
- frameon:是否显示边框
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.1)
# 第一个figure
plt.figure(num=1, figsize=(3,3),facecolor='yellow')
plt.plot(x, np.cos(x))
# 第二个figure
plt.figure(num=2, figsize=(3,3),facecolor='red')
plt.plot(x, np.sin(x))
# 第三个figure
plt.figure(num=3, figsize=(3,3),edgecolor='blue')
plt.plot(x, np.tan(x) )
plt.show()
通过add_subplot方法绘制子图
上一个例子同时展示出了多张图,这里通过add_subplot方法在一张图中绘制出多张子图。
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.1)
# 新建figure对象
fig=plt.figure()
# 子图1
ax1=fig.add_subplot(2,2,1)
ax1.plot(x, 2*x,label='y=2x',color='red')
ax1.legend()
# 子图2
ax2=fig.add_subplot(2,2,2)
ax2.plot(x, 5*x,label='y=5x',color='blue')
ax2.legend()
# 子图3
ax3=fig.add_subplot(2,2,3)
ax3.plot(x, 1/x,label='y=1/x',color='green')
ax3.legend()
# 子图4
ax4=fig.add_subplot(2,2,4)
ax4.plot(x, x*x,label='y=x²',color='orange')
plt.show()
其中add_subplot(x,y,z)表示将白板分割成了x行y列,并将该子图创建在第z个位置。
通过subplot方法绘制子图
通过subplot方法绘制出多张子图,该方法与add_subplot方法类似。
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.1)
plt.subplot(2,1,1) # 第一个子图在2*1的第1个位置
plt.plot(x,2*x)
plt.subplot(2,2,3) # 第二个子图在2*2的第3个位置
plt.plot(x,4*x)
plt.subplot(2,2,4) # 第三个子图在2*2的第4个位置
plt.plot(x,1/x)
plt.show()
子图共享x坐标轴
在同一场景中,子图还可以共享x轴。
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
#分数明细
class1=[98,87,96,82,70,65,66,72,42,58,76,92,100]
class2=[87,55,92,98,95,68,72,84,37,57,87,95,95]
#设置两个子图,并共享x轴
figure,(axClass1, axClass2) = plt.subplots(2, sharex=True, figsize=(10,6))
#设置连续的边界值,即直方图的分布区间,比如[50,60]等
bins=np.arange(50,101,10)
#设置中文,并设置两个子图的标题
plt.rcParams['font.sans-serif']=['SimHei']
axClass1.set_title("class1")
axClass2.set_title("class2")
#在两个子图里绘制直方图,统计各个区间的数值
axClass1.hist(class1,bins,color='red')
axClass2.hist(class2,bins,color='blue')
plt.show()
在大图里绘制子图
在一些场景中,当需要更好展示某段数据时,将子图展示在大图里会更加有效率。
代码如下:
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 新建figure对象
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.9,0.9])
child_ax=fig.add_axes([0.7,0.2,0.2,0.2])
x = np.arange(0, 10.1, 0.1)
ax.plot(x, np.sin(x),color='red')
# 子图
childX = np.arange(5, 6.1, 0.1)
child_ax.plot(childX,np.sin(childX),color='blue')
plt.show()
add_axes方法用来创建子图,其中前两个参数为子图左下角在figure白板上的坐标,后两个参数为子图在x和y轴上的长度。