matplotlib:
最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建
安装:
pip3 install matplotlib
或者: pip3 install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
基本使用:
#-*-coding:utf-8-*-
from matplotlib import pyplot as plt # 导入pyplot
# 数据在x轴的位置,是一个可迭代对象
x = range(2,26,2)
# 数据在y轴的位置,是一个可迭代对象
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 通过实例化一个figure并且传递参数,能够在后台自动使用该figure实例
# dpi使图片更加清晰,整数,表示该窗口的分辨率
# figsize 设置图形的大小,a 为图形的宽,b 为图形的高,单位为英寸
fig = plt.figure(figsize=(20,8),dpi=80)
# 传入x和y,通过plot绘制出折线图
plt.plot(x,y)
plt.xticks(range(2,25)) # 设置x的刻度
plt.yticks(range(min(y),max(y)+1)) # 设置y的刻度
# 保存图片
# plt.savefig("./test1.png")
plt.show() # 画图
效果图:
问题:
如果列表y表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
用随机数字模拟这两个小时的温度变化情况:
y = [random.randint(20,35) for i in range(120)]
当我们需要用到中文字符串作为坐标上显示的内容时,我们发现中文字符不能正常显示
原来Matplotlib 默认情况不支持中文,我们可以使用以下简单的方法来解决。
查看linux/mac下面支持的字体:
fc-list -->查看支持的字体
fc-list :lang=zh -->查看支持的中文(冒号前面有空格)
那么问题来了:如何修改matplotlib的默认字体?
通过matplotlib.rc可以修改,具体方法参见源码(windows/linux)
通过matplotlib 下的font_manager可以解决(windows/linux/mac)!
此外,我们还可以用如下方法查看系统的字体:
from matplotlib import pyplot as plt
import matplotlib
fonts = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
for font in fonts:
print(font)
可以打印出font_manager 下 ttflist 中所有注册的字体名如:文泉驿等宽微米黑(WenQuanYi Micro Hei)
然后用以下代码设置即可:
plt.rcParams['font.family']=['WenQuanYi Micro Hei']
我们可以看到我们电脑自带的中文字体和存储的路径
也可以去百度下载我们喜欢的字体
解决了这个问题以后,就可以正常显示
代码:
from matplotlib import pyplot as plt
import random
import matplotlib
from matplotlib import font_manager
# 第一种解决中文不能显示的问题(windows,linux)
font = {
'family' : 'WenQuanYi Micro Hei', # 字体名(fc-list :lang=zh查出来的)
'weight' : 'bold',
'size' : '10'} # 字体大小
matplotlib.rc("font",**font)
# 第二中解决中文不能显示问题的方法(需要给xticks方法传递参数)
# my_font = font_manager.FontProperties(fname="/usr/share/fonts/truetype/wqy/wqy-microhei.ttc")
# 随机温度
y = [random.randint(20,35) for i in range(120)]
x = list(range(120))
plt.figure(figsize=(20,8))
plt.plot(x,y)
# 调整x的刻度
# 传给xticks的第二个参数,使其显示指定内容
lable_xticks = ["10点:{}分".format(i) for i in range(60)]
lable_xticks += ["11点:{}分".format(i) for i in range(60)]
# 取步长,数字和字符串一一对应,使数据的长度一样
plt.xticks(x[::3],lable_xticks[::3],rotation=45) # rotation指定逆时针选择的度数
# plt.xticks(x[::3],lable_xticks[::3],rotation=45,fontproperties=my_font) # x的刻度
plt.yticks(range(20,35)) # y的刻度
# plt.savefig("./images/temperature2.png")
plt.show()
效果图如下:
作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值。 可以使用以下格式化字符。
字符 描述
'-' 实线样式
'--' 短横线样式
'-.' 点划线样式
':' 虚线样式
'.' 点标记
',' 像素标记
'o' 圆标记
'v' 倒三角标记
'^' 正三角标记
'<' 左三角标记
'>' 右三角标记
'1' 下箭头标记
'2' 上箭头标记
'3' 左箭头标记
'4' 右箭头标记
's' 正方形标记
'p' 五边形标记
'*' 星形标记
'h' 六边形标记 1
'H' 六边形标记 2
'+' 加号标记
'x' X 标记
'D' 菱形标记
'd' 窄菱形标记
'|' 竖直线标记
'_' 水平线标记
以下是颜色的缩写:
字符 颜色
'b' 蓝色
'g' 绿色
'r' 红色
'c' 青色
'm' 品红色
'y' 黄色
'k' 黑色
'w' 白色
要显示圆来代表点,而不是上面示例中的线,请使用 ob 作为 plot() 函数中的格式字符串。
实例:
from matplotlib import pyplot as plt
x = range(1,11)
y = range(1,11)
plt.plot(x,y,"ob")
plt.show()
效果图:
**上述显示离散值参考自菜鸟教程。
给图像添加描述信息:
plt.xlabel("时间") # x轴的描述信息
plt.ylabel("温度") # y轴
plt.title("10点到12点温度随时间的变化情况") # 标题描述
# 当使用第二种解决中文显示问题的方法时,需要为这几个方法传递参数
# 如: plt.xlabel("时间",fontproperties=my_font)
例题:
假设大家在30岁的时候,根据自己的实际情况,统计出来了从11岁到30岁每年交的女(男)朋友的数量如列表a,
请绘制出该数据的折线图,以便分析自己每年交女(男)朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求:
y轴表示个数
x轴表示岁数,比如11岁,12岁等
代码:
from matplotlib import pyplot as plt
import matplotlib
font = {
'family' : 'WenQuanYi Micro Hei',
'weight' : 'bold',
'size' : '10'}
matplotlib.rc("font",**font)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x = range(11,31)
# 设置图像大小
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
# 设置x轴刻度
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x,_xtick_labels)
plt.yticks(range(0,7))
# 绘制网格
plt.grid(color="#f0f",alpha=0.1,linestyle="--",linewidth=3)
# 展示
plt.show()
绘制网格:
plt.grid(color="#f0f",alpha=0.1,linestyle="--",linewidth=3)
# color指定颜色,alpha指定网格透明度,linestyle指定线条的样式,linewidth指定线条宽度
可通过更改x轴和y轴的刻度改变网格的疏密程度
效果图示:
例题:
假设大家在30岁的时候,根据自己的实际情况,统计出来了你和你同桌各自从11岁到30岁每年交的女(男)朋友的数量如列表a和b,请在一个图中绘制出该数据的折线图,以便比较自己和同桌20年间的差异,同时分析每年交女(男)朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
要求:
y轴表示个数
x轴表示岁数,比如11岁,12岁等
一次画多个图:
plt.plot(x,y_1)
plt.plot(x,y_2)
plt.plot(...)
只需要plot多次即可
添加图例:
# 需要在指定数据参数时,传递label参数
plt.plot(x,y_1,label="同桌")
plt.plot(x,y_2,label="自己")
# 然后legend即可
plt.legend()
# 当用第二中方法解决中文显示问题时,需要添加prop参数
plt.legend(prop=my_font)
plt.legend(loc="upper left")
# loc参数:指定图例显示的位置
可供选择的选项:传入数字和字符串都可
'best' : 0,
'upper right': 1,
'upper left' 2,
'lower left ': 3,
'lower right': 4,
'right': 5,
'center left': 6,
'center right' : 7,
'lower center' : 8,
'upper center' : 9,
'center': 10
改变折线的颜色:
plt.plot(x,y_1,label="同桌",color="#aaa",alpha=1,linestyle="-.",linewidth=3)
color指定颜色,alpha指定网格透明度,linestyle指定线条的样式,linewidth指定线条宽度
代码:
from matplotlib import pyplot as plt
import matplotlib
font = {
'family' : 'WenQuanYi Micro Hei',
'weight' : 'bold',
'size' : '10'}
matplotlib.rc("font",**font)
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)
# 设置图像大小
plt.figure(figsize=(20,8),dpi=80)
# 画多个图
plt.plot(x,y_1,label="同桌",color="#ff0",alpha=1,linestyle="-.",linewidth=3)
plt.plot(x,y_2,label="自己",color="#f0f",alpha=1,linestyle=":",linewidth=3)
# 设置x轴刻度
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x,_xtick_labels)
plt.yticks(range(0,7))
# 添加图例
plt.legend(loc="upper left")
# 绘制网格
plt.grid(color="#f0f",alpha=0.1,linestyle="--",linewidth=3)
# 展示
plt.show()
效果图:
对比常用统计图:
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。
一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)
条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
更多图请参考matplotlib官网:
https://matplotlib.org/gallery/index.html
官网中每种图都有其指定的代码样例