Python数据分析:matplotlib模块

Python数据分析:matplotlib模块

  • 一:matplotlib模块简介
  • 二:matplotlib绘制折线图
    • 2.1 简单使用
    • 2.2 设置图片大小
    • 2.3 设置轴刻度
    • 2.4 添加描述信息
    • 2.5 绘制多条折线
  • 三:matplotlib绘制折线图
  • 四:matplotlib绘制条形图
    • 4.1 绘制竖条形图
    • 4.2 绘制横条形图
    • 4.3 绘制多次条形图
  • 五:绘制直方图

一:matplotlib模块简介

matplotlib官方文档:

https://matplotlib.org/gallery/index.html

什么是matplotlib?
最流行的python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建

为什么要学习matplotlib模块?

  1. 能将数据进行可视化,更直观的呈现
  2. 使数据更加客观,更具说服力

二:matplotlib绘制折线图

下面通过一个小实例来看下matplotlib如何使用。

2.1 简单使用

假设一天中每隔两个小时(range(2,26,2))的气温分别是 [15,13,14.5,17,20,25,26,26,24,22,18,15],通过matplotlib模块绘制出气温图

from matplotlib import pyplot as plt
# 数据在x轴的位置,是一个可迭代对象
x = range(2,26,2)
# 数据在y轴的位置,是一个可迭代对象;
# x轴y轴的数据一起组成了所有要绘制出的坐标
# 分别是(2,16), (4,13) ...
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
# 传入x和y通过plot绘制出折线图
plt.plot(x, y)
# 在执行程序的时候展示图形
plt.show()

绘图出的图表如下:
Python数据分析:matplotlib模块_第1张图片
但是生成的图表存在以下问题:

  1. 设置图片大小(想要一个高清无码大图)
  2. 保存到本地
  3. 描述信息,如X轴Y轴表示什么,这个图表示什么
  4. 调整X或者Y的刻度的间距
  5. 线条的样式(如颜色,透明度等)
  6. 标记出特殊的点(比如告诉别人最高点和最低点在哪里)
  7. 给图片添加一个水印(防伪,防盗)

2.2 设置图片大小

from matplotlib import pyplot as plt
# 设置图片大小
plt.figure(figsize=(20, 8), dpi=80)
'''
figure图形图标的意思,在这里指的就是我们画的图
通过实例化一个figure并且传递参数能够在后台自动使用该figure实例
在图像模糊的时候可以传入dpi参数,让图片更加清晰
'''
# 数据在x轴的位置,是一个可迭代对象
x = range(2, 26, 2)
# 数据在y轴的位置,是一个可迭代对象;
# x轴y轴的数据一起组成了所有要绘制出的坐标
# 分别是(2,16), (4,13) ...
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15]
# 传入x和y通过plot绘制出折线图
plt.plot(x, y)
plt.savefig('./0.png')
# 可以保存为svg这种矢量图模式,放大不会有锯齿

2.3 设置轴刻度

from matplotlib import pyplot as plt
plt.figure(figsize=(20, 8), dpi=80)
x = range(2, 26, 2)
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15]
plt.plot(x, y)
# 设置x轴的刻度
plt.xticks(x)				# X轴刻度:2,4,6,8 ...
# plt.xticks(range(2,25))	# X轴刻度:2,3,4,5,6,7,8 ...
# 设置y轴刻度
plt.yticks(range(min(y), max(y) + 1))
plt.show()

Python数据分析:matplotlib模块_第2张图片
下面再看一个调整轴刻度的案例:如果下面的列表y表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?

y = [random.randint(20, 35) for i in range(120)]
import matplotlib
from matplotlib import pyplot as plt
import random
from matplotlib import font_manager
# matplotlib默认不显示中文
# 设置字体的方式一:
font = {'family': 'Microsoft YaHei', 'weight' : 'bold'}
matplotlib.rc('font', **font)
x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y)
# 调整x轴刻度
_x = x
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
plt.xticks(list(x)[::3], _xtick_labels[::3], rotation = 45)	# rotation逆时针旋转45度
# [::3]设置步长为3
plt.show()

效果图如下:
Python数据分析:matplotlib模块_第3张图片

2.4 添加描述信息

import matplotlib
from matplotlib import pyplot as plt
import random
# matplotlib默认不显示中文字符
# 设置字体的方式一:
font = {'family': 'Microsoft YaHei', 'weight' : 'bold'}
matplotlib.rc('font', **font)
x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y)
# 调整x轴刻度
_x = x
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
plt.xticks(list(x)[::3], _xtick_labels[::3], rotation = 45)
# 添加描述信息
plt.xlabel('时间')
plt.ylabel('温度 单位(℃)')
plt.title('10点到12点每分钟的气温变化情况')
plt.show()

Python数据分析:matplotlib模块_第4张图片

2.5 绘制多条折线

假设小明在30岁的时候根据自己的实际情况,统计出来了和同桌各自从11岁到30岁每年交的女(男)朋友的数量,如下列表a和b请在一个图中绘制出该数据的折线图,以便比较自己和同桌的20年间的差异,同时分析每年交女(男)朋友的数量走势。

import matplotlib
from matplotlib import pyplot as plt
# matplotlib默认不显示中文字符
# 设置字体的方式一:
font = {'family': 'Microsoft YaHei', 'weight': 'bold'}
matplotlib.rc('font', **font)
x = range(11, 31)
y_1 = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 3]
y_2 = [2, 0, 3, 1, 2, 2, 3, 3, 2, 1, 2, 1, 1, 3, 1, 1, 1, 7, 1, 1]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y_1, label='小徐', color='orange', linestyle=':', linewidth=5)
plt.plot(x, y_2, label='同桌', color='cyan', linestyle='--', linewidth=3)
# 调整x轴刻度
_x = x
_xtick_labels = ["{}岁".format(i) for i in range(11, 31)]
plt.xticks(list(x), _xtick_labels)
# 绘制网格
plt.grid(alpha=0.4)
# 添加图例:legend会根据plt.plot中的label参数生成图例,即哪条线表示哪个人
# loc控制图例显示的位置
plt.legend(loc='upper left')
# 添加描述信息
plt.xlabel('年龄')
plt.ylabel('女朋友数量')
plt.title('11岁到30岁交女朋友的数量')

Python数据分析:matplotlib模块_第5张图片

三:matplotlib绘制折线图

假设通过爬虫获取到了某城市2018年3,10月份每天白天的最高气温(下面的列表x_3,x_10),那么此时如何寻找出气温和随时间变化的某种规律?

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,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
import matplotlib
from matplotlib import pyplot as plt

font = {'family': 'Microsoft YaHei', 'weight': 'bold'}
matplotlib.rc('font', **font)

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,18,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[::2], _xtick_labels[::2], rotation = 45)

# 添加图例
plt.legend(loc = 'upper left')

plt.xlabel('时间')
plt.ylabel('温度')
plt.title('标题')

plt.show()

Python数据分析:matplotlib模块_第6张图片

四:matplotlib绘制条形图

2017年内地电影票房前20的电影和电影票房,那么如何直观的展示该数据?

a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧!爸爸', '加勒比海盗5:死无对证', '金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章',
     '乘风破浪', '神偷奶爸', '智取威虎山', '大闹天竺', '金刚狼3:殊死一战', '蜘蛛侠:英雄归来', '悟空传', '银河护卫队2', '情圣', '新木乃伊']
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88,
     6.86, 6.58, 6.23]

4.1 绘制竖条形图

import matplotlib
from matplotlib import pyplot as plt

font = {'family': 'Microsoft YaHei'}
matplotlib.rc('font', **font)
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧!爸爸', '加勒比海盗5:死无对证', '金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章',
     '乘风破浪', '神偷奶爸', '智取威虎山', '大闹天竺', '金刚狼3:殊死一战', '蜘蛛侠:英雄归来', '悟空传', '银河护卫队2', '情圣', '新木乃伊']
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88,
     6.86, 6.58, 6.23]

plt.figure(figsize=(20, 10), dpi=80)
plt.bar(range(len(a)), b, width=0.3)
plt.xticks(range(len(a)), a, rotation=90)
#plt.savefig('./movie.png')
plt.show()

Python数据分析:matplotlib模块_第7张图片

4.2 绘制横条形图

import matplotlib
from matplotlib import pyplot as plt

font = {'family': 'Microsoft YaHei'}
matplotlib.rc('font', **font)
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧!爸爸', '加勒比海盗5:死无对证', '金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章',
     '乘风破浪', '神偷奶爸', '智取威虎山', '大闹天竺', '金刚狼3:殊死一战', '蜘蛛侠:英雄归来', '悟空传', '银河护卫队2', '情圣', '新木乃伊']
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88,
     6.86, 6.58, 6.23]
plt.figure(figsize=(20, 8), dpi=80)
plt.barh(range(len(a)), b, height=0.3, color = 'orange')	# 注意这里是height控制线条的粗细
plt.yticks(range(len(a)), a)
plt.grid(alpha = 0.3)
# plt.savefig('./movie.png')
plt.show()

Python数据分析:matplotlib模块_第8张图片

4.3 绘制多次条形图

import matplotlib
from matplotlib import pyplot as plt

font = {'family': 'Microsoft YaHei'}
matplotlib.rc('font', **font)
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇']
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
plt.figure(figsize=(20, 8), dpi = 80)
bar_width = 0.2
x_14 = list(range(len(a)))
x_15 = [i + bar_width for i in x_14]
x_16 = [i + bar_width*2 for i in x_14]
plt.bar(x_14, b_14, width = bar_width)
plt.bar(x_15, b_15, width = bar_width)
plt.bar(x_16, b_16, width = bar_width)
plt.xticks(x_15, a)
plt.show()

Python数据分析:matplotlib模块_第9张图片

五:绘制直方图

假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(如时长为100分钟到120分钟电影的数量,出现的频率)等信息,该如何呈现这些数据?

import matplotlib
from matplotlib import pyplot as plt

font = {'family': 'Microsoft YaHei'}
matplotlib.rc('font', **font)
a = [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]
d = 2           # 组距
# 设置组数  组数 = 极差 // 组距
num_bins = (max(a) - min(a)) // d
plt.figure(figsize=(20, 8), dpi=80)
# 绘制直方图,目前官方已经废弃normed参数,使用density来替换
# plt.hist的第三个参数:density=True,绘制的图即为频率直方图
plt.hist(a, num_bins)
plt.xticks(range(min(a), max(a)+d, d))
plt.grid()
plt.show()

Python数据分析:matplotlib模块_第10张图片
直方图与与其他matplotlib所绘制图形差别比较大,在plt.hist方法中所要传入的参数第一个为x轴上的数据,第二个参数是组数,其中组数的公式为:

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

你可能感兴趣的:(Python数据分析,Python数据分析,matplotlib模块)