Matplotlib (MATLAB_Python) 数据处理
Matplotlib基本要点
可以画的图像(https://matplotlib.org/stable/gallery/index)
使用流程:
- 明确问题
- 选择图形的呈现方式
- 准备数据
- 绘图和图形完善
绘制例子(交互):
- 百度Echarts
- plotly:可视化工具中的github,同时兼容matplotlib和pands https://plot.ly/python/
1. 绘制折线图
-
设置图片大小
-
保存到本地
-
调整间距
# 使用as可以让调用函数的时候更简单 from matplotlib import pyplot as plt """ figure:指我们画的图(设置图片大小 dpi: 让图片更加清晰(清晰程度) """ fig = plt.figure(figsize=(20,8), dpi=80) # 数据在x轴的位置,是一个可迭代对象 x = range(2, 26, 2) # 数据在y轴的位置, 是一个可迭代对象 y = [15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15] # 通过传入x和y,通过plot绘制出折线图 plt.plot(x, y) # 在执行程序的时候展示图形 """ 设置x轴的刻度(y轴是一样的:yticks):y轴range(min(y), max(y)+1) 可以使用range函数改变步长 如果有步长为小数,可以使用列表推导式 可以用列表取步长的操作[start:stop:step]改变步长 如果不想让他显示x轴刻度,不传就可以了 """ _xtick_labels = [i/2 for i in range(2, 49)] plt.xticks(_xtick_labels[::3]) """ 保存图片(先生成图片后保存) 可以保存为.swg这种矢量图格式,放大不会有锯齿 括号内是保存图片的名称 """ plt.savefig("./t1.png") plt.show()
-
描述信息
-
标记出特殊的点
-
添加水印
import random from matplotlib import pyplot as plt import matplotlib from matplotlib import font_manager """ 如何设置中文,import matplotlib 使用matplotlib.rc + (Command + B)去到源码,改font就可以 option + Command + L 快速调整格式 """ # 这种方式Mac无效,Linux和windows可以 # font = {'family': 'MicroSoft Yahei', # 'weight': 'bold', # 'size': 'larger'} # matplotlib.rc("font", **font) # matplotlib.rc("font", family='MicroSoft Yahei', weight='bold', size='larger') # Mac设置中文的方法, 使用fc-list :lang=zh找到地址 # from matplotlib import font_manager # fname是地址 my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc") x = range(0, 120) y = [random.randint(20, 35) for i in range(120)] fig = plt.figure(figsize=(20, 8), dpi=80) # 调整x轴的刻度,显示小时:分钟 _x = list(x) _xtick_labels = ["10:{}".format(i) for i in range(60)] _xtick_labels += ["11:{}".format(i) for i in range(60)] # 调整坐标轴刻度的两个参数的步长需要一一对应,格式也要 # rotation是旋转的度数(逆时针转) # 需要解决中文为什么不显示的问题 plt.xticks(_x[::6], _xtick_labels[::6], rotation=45, fontproperties=my_font) # 添加描述信息 plt.xlabel("时间", fontproperties=my_font) plt.ylabel("温度", fontproperties=my_font, rotation=90) plt.title("10点到12点每分钟的气温变化情况", fontproperties=my_font) """ 绘制网格 alpha透明度 """ plt.grid(alpha=0.05) # 添加水印的第一种方式 plt.text(0.5, 0.5, 'Watermark', fontsize=40, color='gray', alpha=0.5, ha='center', va='center', rotation=30, transform=plt.gcf().transFigure) # 添加水印的第二种方式 # 需要忽略前面的fig = plt.figure(...) # fig, ax = plt.subplots(figsize=(20, 8), dpi=80) # ax.plot(x, y) # ax.text(0.5, 0.5, 'Watermark', fontsize=40, color='gray', alpha=0.5, ha='center', va='center', rotation=30, # transform=ax.transAxes) # 设置图像颜色和线条样式 plt.plot(x, y, label="练习", color="cyan", linestyle="-.") # 标记特殊点 # 在特殊点标记红色圆圈 special_points_x = [2, 4] special_points_y = [20, 30] plt.scatter(special_points_x, special_points_y, color='red', label='Special Points') # 添加标签,例子中可能不贴合图像 for i, txt in enumerate(special_points_y): plt.text(special_points_x[i], special_points_y[i], f'({special_points_x[i]}, {txt})') # 添加图例,只有这里面显示中文是prop,其余都是fontproperties plt.legend(prop=my_font, loc="upper left") plt.savefig("./t1.png") plt.show()
2. 绘制散点图
重点:
plt.scatter(x,y)
plot变成了scatter
from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc") 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.yticks(range(min(y_3), max(y_3) + 1)) 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) _xticks_labels = ["3月{}日".format(i) for i in x_3] _xticks_labels += ["10月{}日".format(i-50) for i in x_10] plt.xticks(_x[::3], _xticks_labels[::3], fontproperties=my_font, rotation=45) #添加描述信息 plt.xlabel("时间", fontproperties=my_font) plt.ylabel("温度", fontproperties=my_font) plt.title("在3月和10月温度随时间的变化", fontproperties=my_font) # 添加图例 plt.legend(prop=my_font, loc="upper left") # 展示 plt.show()
3. 绘制条形图
重点:
plt.bar()
from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc") fig = plt.figure(figsize=(20, 10), dpi=80) # 数据来源:http://58921.com/alltime/2017 a = ["战狼2", "速度与激情8", "功夫瑜伽", "西游伏妖篇", "变形金刚5:最后的骑士", "摔跤吧!爸爸", "加勒比海盗5:死无对证", "金刚:骷髅岛", "极限特工:终极回归", "生化危机6:终章", "乘风破浪", "神偷奶爸3", "智取威虎山", "大闹天竺", "金刚狼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.bar(range(len(a)), b, width=0.3) # 绘制一个横的条形图 plt.barh(range(len(a)), b, height=0.3) plt.grid(alpha=0.3) plt.yticks(range(len(a)), a,fontproperties=my_font) plt.show()
绘制多重条形图
from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc") fig = plt.figure(figsize=(20, 10), dpi=80) # 数据来源:http://www.cbooo.cn/movieday a = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"] b_14 = [2358, 399, 2358, 362] b_15 = [12357, 156, 2045, 168] b_16 = [15746, 312, 4497, 319] bar_width = 0.2 x_14 = list(range(len(a))) x_15 = [i + 0.2 for i in x_14] x_16 = [i + 0.2 * 2 for i in x_14] 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.xticks(x_15, a, fontproperties=my_font) plt.legend(loc="upper right",prop=my_font) plt.show()
4. 绘制直方图
组数 = 极差 组距 = m a x ( a ) − m i n ( a ) b i n w i d t h 组数=\frac{极差}{组距}=\frac{max(a)-min(a)}{bin_{width}} 组数=组距极差=binwidthmax(a)−min(a)
重点:
plt.hist()
#需要使用原有数据,不能使用统计数据(条形图),才能绘制直方图 from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc") fig = plt.figure(figsize=(20, 8), dpi=80) a = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 110, 78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 127, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103, 136, 128, 102, 120, 114, 105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102, 123, 107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133, 112, 130, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135, 115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154, 136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141, 120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126, 140, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92, 121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113, 134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111, 111, 133, 150] # 组距要选择最大值-最小值能被整除的 # print((max(a) - min(a))) # 计算组数 bin_width = 3 num_bins = int((max(a) - min(a)) / bin_width) # density=bool,是否绘制频率分布直方图,默认为频数直方图 plt.hist(a, num_bins, density=True) # 设置x轴刻度 plt.xticks(range(min(a), max(a) + bin_width, bin_width)) plt.grid(alpha=0.6) plt.show()
经过统计的数据绘制条形图:
from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc") # 时间间隔 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, 2596, 1438, 3273, 642, 924, 613, 215, 47] fig = plt.figure(figsize=(20, 8), dpi=80) plt.bar(range(len(quantity)), quantity, width=1) # 设置x轴的刻度,左加右减 # i-0.5 将刻度标签的位置从条形的中心向左偏移半个单位,以便刻度标签居中对齐在两个条形之间 _x = [i - 0.5 for i in range(len(quantity) + 1)] print(_x) _xticks_label = interval + [150] plt.xticks(_x, _xticks_label) plt.grid(alpha=0.4) plt.show()
代码课程来源:
【【python教程】数据分析——numpy、pandas、matplotlib】
https://www.bilibili.com/video/BV1hx411d7jb?p=13&vd_source=60fe04a9d6b8a78937ea6e0fb8eb7b0b