matplotlib官方文档:
https://matplotlib.org/gallery/index.html什么是matplotlib? 最流行的python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建
为什么要学习matplotlib模块?
能将数据进行可视化,更直观的呈现使数据更加客观,更具说服力下面通过一个小实例来看下matplotlib如何使用。
假设一天中每隔两个小时(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()绘图出的图表如下: 但是生成的图表存在以下问题:
设置图片大小(想要一个高清无码大图)保存到本地描述信息,如X轴Y轴表示什么,这个图表示什么调整X或者Y的刻度的间距线条的样式(如颜色,透明度等)标记出特殊的点(比如告诉别人最高点和最低点在哪里)给图片添加一个水印(防伪,防盗)下面再看一个调整轴刻度的案例:如果下面的列表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()效果图如下:
假设小明在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岁交女朋友的数量')假设通过爬虫获取到了某城市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()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]假设你获取了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()直方图与与其他matplotlib所绘制图形差别比较大,在plt.hist方法中所要传入的参数第一个为x轴上的数据,第二个参数是组数,其中组数的公式为:
- 组数: 将数据分组,当数据在100个以内时,按数据多少常分5-12组 - 组距:指每个小组的两个端点的距离 - 组数 = 极差 // 组距, - 极差 = 数组中的最大值 - 数组中的最小值 - 但是需要根据极差来定义,一般来说,极差越大,组距就越大