数据分析之matplotlib画图工具的使用(一)

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

官网中每种图都有其指定的代码样例

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/108900030