Python数据分析: matplotlib模块学习之绘制常用统计图

18 篇文章 0 订阅
6 篇文章 0 订阅

matplotlib绘制常用的统计图

常用的统计图有散点图, 折线图, 条形图和直方图, 在前面我们已经讲解了折线图的基本实现,但其实绘制其他图形和折线图比起来也是相差不多的, 下面就来逐个讲解他们的不同之处吧

绘制散点图 plt.scatter

下面给出一个matplotlib绘制散点图的实例代码

from matplotlib import pyplot as plt
from matplotlib import font_manager

"""
题目:
    假设通过爬虫你获取到了重庆2019年3月,10月份的每天的平均气温(分别别位于列表a, b),那么
    此时如何寻找出气温和随时间(天)变化的某种规律
    y_3 = ['15', '11', '18', '12', '14', '13', '13', '12', '15', '20', '22', '17', '15', '13', '15', '18', '17', '22', '25', '26', '22', '12', '11', '12', '20', '21', '20', '25', '30', '18', '15']
    
    y_10 = ['30', '29', '30', '22', '22', '27', '23', '21', '21', '22', '22', '22', '23', '19', '18', '19', '23', '24', '26', '18', '18', '19', '18', '20', '14', '14', '16', '20', '22', '23', '23']
    数据来源: 
"""

# 重庆3月份的天气气温
y_3 = ['15', '11', '18', '12', '14', '13', '13', '12', '15', '20', '22', '17', '15', '13', '15', '18', '17', '22', '25',
       '26', '22', '12', '11', '12', '20', '21', '20', '25', '30', '18', '15']

# 重庆10月份的最高气温
y_10 = ['30', '29', '30', '22', '22', '27', '23', '21', '21', '22', '22', '22', '23', '19', '18', '19', '23', '24',
        '26', '18', '18', '19', '18', '20', '14', '14', '16', '20', '22', '23', '23']

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

# 设置字体
my_font = font_manager.FontProperties(fname=r'C:\Windows\Fonts\simkai.ttf')
plt.figure(figsize=(20, 8), dpi=100)

# 绘制散点图, 添加图例
plt.scatter(x_3, y_3, label="3月份气温")
plt.scatter(x_10, y_10, label="10月份气温")

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

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

# 添加图像描述
plt.xlabel("时间", fontproperties=my_font)
plt.ylabel("日期", fontproperties=my_font)
plt.title("重庆三月份和十月份气温对比散点图", fontproperties=my_font)

plt.savefig('./重庆气味散点图.png')

plt.show()

代码运行之后的结果
重庆天气
可以看出,绘制散点图的方法和绘制折线图的方法就只有一点不同

绘制条形:plt.bar

条形图实例:

"""
练一练:
    假设你获取到了2018年内地电影票房前20的电影(列表a)和电影票房数据(列表b)
    那么应该如何更加直观的展示数据该数据
    a = ['红海行动', '唐人街探案2', '我不是药神', '西虹市首富', '复仇者联盟3:无限战争', '捉妖记2', '海王', '毒液:致命守护者', '侏罗纪世界2', '头号玩家', '后来的我们', '一出好戏', '无双', '碟中谍6:全面瓦解', '巨齿鲨', '狂暴巨兽', '超时空同居', '蚁人2:黄蜂女现身', '无名之辈', '无问西东']

    b = [36.22, 33.71, 30.75, 25.27, 23.7, 22.19, 19.97, 18.56, 16.82, 13.85, 13.5
    13.44, 12.63, 12.34, 10.43, 9.94, 8.25, 7.88, 7.47]

    数据来源: http://58921.com/alltime/2018
"""

from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname=r'C:\Windows\Fonts\simkai.ttf')

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

a = ['红海行动', '唐人街探案2', '我不是药神', '西虹市首富', '复仇者联盟3:无限战争', '捉妖记2', '海王', '毒液:致命守护者', '侏罗纪世界2', '头号玩家', '后来的我们', '一出好戏', '无双', '碟中谍6:全面瓦解', '巨齿鲨', '狂暴巨兽', '超时空同居', '蚁人2:黄蜂女现身', '无名之辈', '无问西东']

b = [36.22, 33.71, 30.75, 25.27, 23.7, 22.19, 19.97, 18.56, 16.82, 13.85, 13.5,
      13.44, 12.63, 12.34, 10.43, 9.94, 8.25, 7.88, 7.47, 6.5]

# 绘制横着的条形图,设置高度用height
plt.barh(range(len(a)), b, height=0.5, color="orange")

# plt.bar(range(len(a)), b, width=0.5, color="orange")  # 绘制竖着的条形图,设置宽度用width
plt.yticks(range(len(a)), a, fontproperties=my_font)

# 添加图形描述
plt.ylabel("电影名称", fontproperties=my_font)
plt.xlabel("电影票房", fontproperties=my_font)
plt.title("2018年排名前20的电影", fontproperties=my_font)

# 增加网格
plt.grid(alpha=0.5)

plt.show()

绘制的条状图如下
条形图
值得注意的是:绘制竖向折线图使用plt.bar, 绘制横向折线图使用plt.barh

绘制直方图: plt.hist()

matplotlib绘制直方图如下:

"""
练一练:
    假设你获取了250部电影的时长(列表a中),希望统计出这些电影
    市场的分布状态(比图时长为100分钟到120分钟电影的数量, 出现的频率)等信息,
    你应该如何呈现这些数据?
    time = [114, 143, 116, 91, 134, 134, 108, 138, 99, 137, 98, 108, 140, 87, 110, 143, 123, 133, 143, 150, 146, 96, 80, 102, 81, 120, 81, 136, 139, 83, 115, 102, 115, 99, 141, 134, 131, 84, 93, 119, 119, 147, 90, 129, 113, 106, 138, 134, 84, 105, 112, 128, 86, 111, 108, 149, 92, 107, 125, 108, 94, 84, 131, 125, 87, 87, 120, 115, 110, 145, 100, 89, 150, 84, 139, 85, 131, 124, 126, 137, 81, 82, 83, 94, 87, 117, 108, 128, 117, 123, 145, 96, 118, 133, 115, 89, 144, 124, 119, 81, 138, 93, 114, 129, 109, 99, 90, 146, 132, 144, 106, 138, 132, 145, 143, 140, 125, 83, 137, 83, 135, 107, 150, 117, 82, 116, 106, 147, 87, 83, 126, 115, 80, 139, 111, 113, 112, 124, 88, 87, 111, 146, 140, 113, 81, 115, 94, 136, 129, 142, 146, 150, 117, 98, 81, 84, 104, 85, 149, 133, 119, 89, 134, 105, 130, 124, 84, 92, 110, 147, 104, 112, 83, 89, 88, 89, 134, 111, 135, 106, 106, 96, 129, 147, 111, 137, 107, 109, 142, 80, 83, 101, 120, 110, 140, 121, 102, 132, 118, 119, 140, 107, 89, 148, 133, 135, 148, 96, 138, 136, 120, 83, 100, 88, 146, 85, 99, 113, 83, 80, 132, 87, 81, 87, 148, 87, 90, 148, 143, 137, 90, 88, 118, 92, 108, 119, 144, 101, 140, 96, 111, 104, 112, 108, 137, 93, 108, 134, 126, 89]

"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

# 设置字体
my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simkai.ttf")

time = [114, 143, 116, 91, 134, 134, 108, 138, 99, 137, 98, 108, 140, 87, 110, 143, 123, 133, 143, 150, 146, 96, 80, 102, 81, 120, 81, 136, 139, 83, 115, 102, 115, 99, 141, 134, 131, 84, 93, 119, 119, 147, 90, 129, 113, 106, 138, 134, 84, 105, 112, 128, 86, 111, 108, 149, 92, 107, 125, 108, 94, 84, 131, 125, 87, 87, 120, 115, 110, 145, 100, 89, 150, 84, 139, 85, 131, 124, 126, 137, 81, 82, 83, 94, 87, 117, 108, 128, 117, 123, 145, 96, 118, 133, 115, 89, 144, 124, 119, 81, 138, 93, 114, 129, 109, 99, 90, 146, 132, 144, 106, 138, 132, 145, 143, 140, 125, 83, 137, 83, 135, 107, 150, 117, 82, 116, 106, 147, 87, 83, 126, 115, 80, 139, 111, 113, 112, 124, 88, 87, 111, 146, 140, 113, 81, 115, 94, 136, 129, 142, 146, 150, 117, 98, 81, 84, 104, 85, 149, 133, 119, 89, 134, 105, 130, 124, 84, 92, 110, 147, 104, 112, 83, 89, 88, 89, 134, 111, 135, 106, 106, 96, 129, 147, 111, 137, 107, 109, 142, 80, 83, 101, 120, 110, 140, 121, 102, 132, 118, 119, 140, 107, 89, 148, 133, 135, 148, 96, 138, 136, 120, 83, 100, 88, 146, 85, 99, 113, 83, 80, 132, 87, 81, 87, 148, 87, 90, 148, 143, 137, 90, 88, 118, 92, 108, 119, 144, 101, 140, 96, 111, 104, 112, 108, 137, 93, 108, 134, 126, 89]

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

# 设置组距
d = 2
# 设置组数  组数 = 极差 // 组距
num_bins = (max(time) - min(time)) // d

# 绘制直方图,目前官方已经废弃normed参数,使用density来替换
plt.hist(time, num_bins, density=True)

# 设置x轴的刻度
plt.xticks(range(min(time), max(time)+d, d))

plt.grid()
plt.show()

绘制图形如下
直方图
直方图与与其他matplotlib所绘制图形差别比较大,在plt.hist方法中所要传入的参数第一个为x轴上的数据,第二个参数是组数,其中组数的公式为:

- 组数: 将数据分组,当数据在100个以内时,按数据多少常分5-12组
- 组距:指每个小组的两个端点的距离
- 组数 = 极差 // 组距,
- 极差 = 数组中的最大值 - 数组中的最小值
- 但是需要根据极差来定义,一般来说,极差越大,组距就越大

在plt.hist()方法中使用density=true就可以显示各个分组的频率
除了这些以外与其他绘制图相比也没有什么大的区别了

小结: 一般来说能够使用plt.hist方法的是那些没有统计过的数据

总结

直方图:有一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴
表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示遗嘱或者多组数据的分布状况(统计)

条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)

散点图: 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种
关联或总结坐标点的分布模式。
特点: 判断变量之间是否存在数量关联趋势,展示离群点。(分布规律)

当然matplotlib还能绘制更加多种多样的图形,在这里就不多加赘述了,要是想了解更多图形的绘制方法,可以去matplotlib的官网查看学习,目前

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值