Python之matplotlib常用统计图

本文主要内容:

  1. 绘制散点图
  2. 绘制条形图
  3. 绘制直方图

绘制散点图 plt.scatter(x,y)

  • 与绘制折线图plt.plot(x,y)类似,唯一区别是调用scatter方法
  • 绘制2016年北京3月份与10月份的气温变化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# coding=utf-8
import matplotlib.pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc") # windows系统下获取微软雅黑字体
y_3 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,28,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]

x_3 = range(1,32)
x_10 = range(51,82)

#设置图形大小
plt.figure(figsize=(20,8),dpi=80)

#使用scatter方法绘制散点图,和之前绘制折线图的唯一区别
plt.scatter(x_3,y_3,label="3月份")
plt.scatter(x_10,y_10,label="10月份")

#调整x轴的刻度
_x = list(x_3)+list(x_10)
_xtick_labels = ["3月{}日".format(i) for i in x_3]
_xtick_labels += ["10月{}日".format(i-50) for i in x_10]
plt.xticks(_x[::3],_xtick_labels[::3],fontproperties=my_font,rotation=45)

#添加图例
plt.legend(loc="upper left",prop=my_font)

#添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
plt.title("标题",fontproperties=my_font)
#展示
plt.show()

绘制条形图 plt.bar(x,y)

  • 绘制2017年内地电影票房前20的电影及票房
  • 绘制竖着的条形图plt.bar,条形宽度通过width控制
1
2
3
4
#绘制条形图
plt.bar(range(len(a)),b,width=0.3)
#设置字符串到x轴
plt.xticks(range(len(a)),a,fontproperties=my_font,rotation=45)
  • 绘制横着的条形图plt.barh,条形宽度通过height控制
1
2
3
4
#绘制横着的条形图
plt.barh(range(len(a)),b,height=0.3,color="orange")
#设置字符串到y轴
plt.yticks(range(len(a)),a,fontproperties=my_font)
  • 绘制多个条形图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# coding=utf-8
from matplotlib import pypot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")

a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]

bar_width = 0.2

x_14 = list(range(len(a)))
x_15 = [i+bar_width for i in x_14] # 向右移动width的距离
x_16 = [i+bar_width*2 for i in x_14]

#设置图形大小
plt.figure(figsize=(20,8),dpi=80)

plt.bar(range(len(a)),b_14,width=bar_width,label="9月14日")
plt.bar(x_15,b_15,width=bar_width,label="9月15日")
plt.bar(x_16,b_16,width=bar_width,label="9月16日")

#设置图例
plt.legend(prop=my_font)

#设置x轴的刻度
plt.xticks(x_15,a,fontproperties=my_font)

plt.show()

绘制直方图plt.hist()

把数据分为若干组进行统计,组数要适当

  • 组数:将数据分组,当数据在100个以内时,按数据多少常分5到12组
  • 组距:指每个小组的两个端点的距离
  • 组数:极差/组距
  • 注意组数最好是整数,不然刻度会有偏差
  • 若数据是分组统计之后的数据,无法做hist直方图,可用bar做无间隔的条形图
1
2
3
4
5
6
7
bin_width = 3 # 设置组距为3
num_bins = (max(a)-min(a))//bin_width # 分为多少组
plt.hist(a,num_bins) #传入需要统计的数据以及组数
# plt.hist(a,[min(a)+i*bin_width for i in range(num_bins)]) #可传入一个列表,长度为组数,值为分组依据,当组距不均匀时使用
# plt.hist(a,num_bins,normed=1) #normed:bool 是否绘制频率分布直方图,默认为频数直方图
plt.xticks(list(range(min(a),max(a)))[::bin_width],rotation=45)
plt.grid(True,linestyle="-.",alpha=0.5) #显示网格

绘制不等间距条形图

  • 若数据是分组统计之后的数据,无法做hist直方图,可用bar做无间隔的条形图
1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt

interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]

plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(12),quantity,width=1) #加宽条形使其重叠
_x = [i-0.5 for i in range(13)]
_xtick_labels = interval + [150]
plt.xticks(_x,_xtick_labels)

plt.show()

详细说明请查看matplotlib中文文档