开新坑啦!之前都是晚上七点以后开始学习,今天上午把matplotlib中文显示的问题解决,就开始刷课了。第三部分开启。
老规矩,先上图
01绘制散点图
开篇老师上手一个一周天气的练习。
我跟着标注的数据来源,发现北京历史天气查询_北京历史天气预报_北京历史天气记录_北京历史气温_天气网 并没有这一串数组。只好手输入,这里数据自取,代码完善散点表细节后po出来。
#三月数据
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,
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]
散点图的绘制练习。代码自取,字体文件路径处需要自行修改。
# encoding:utf-8
# from ruby in 2019/09/03 15:43
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/XXX.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,
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, 31)
x_10 = range(51, 82)
# 设置图形大小
plt.figure(figsize=(20, 8), dpi=80)
# 使用sctter方法绘制散点图 和绘制其他图的唯一区别
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) for i in x_10]
plt.xticks(_x[::3], _xtick_labels[::3], fontproperties=my_font,rotation=45)
# 添加描述信息
plt.xlabel("时间",fontproperties= my_font)
plt.ylabel("温度",fontproperties= my_font)
plt.title("三月与十月的温度散点图",fontproperties= my_font)
plt.legend(loc="upper left",prop=my_font)
plt.show()
运行结果如下:
02绘制条形图
这里老师给的是2017的统计,为了回应现在的时间,所以选择2019的统计,数据链接:2019年总票房 - 电影票房排行榜 - 电影票房数据库
手动把这些排名录下来,还有另一个票房数组。需要自取。
# encoding:utf-8
# from ruby in 2019/09/03 16:32
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/XX.ttc 老规矩 自己字体的文件")
a = ["红海行动", "唐人街探案2", "我不是药神", "西虹市首富", "复仇者联盟3:\n无限战争", "捉妖记2", "海王", "毒液:\n致命守护者", "侏罗纪世界2",
"头号玩家", "后来的我们", "一出好戏", "无双", "碟中谍6:\n全面瓦解", "巨齿鲨", "狂暴巨兽", "超时空同居", "蚁人2:\n黄蜂女现身", "无名之辈", "无问西东"]
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.91,
8.25, 7.88, 7.47]
# print(len(a))
# print(len(b))
plt.figure(figsize=(20, 15), dpi=80)
# plt.bar(range(len(a)), b, width=0.3)
plt.barh(range(len(a)), b, height=0.3, color="orange")
# plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=60)
plt.yticks(range(len(a)), a, fontproperties=my_font)
# plt.savefig("./movierank.png")
plt.grid(alpha=0.3)
plt.show()
运行结果如下,可以看到,三张图,分别设置的。
接下来老师开始了新的练习,主要是做三天的票房,对比。
我的一个思路是:先画三个条形图(分别设red green yellow)X轴应该是电影 Y轴为票房 用颜色区分天数-不同的条形图 这样会更合适
我可以先尝试一下再跟老师,本来今天打算把这个听完就去整理专利的。忽然兴起,想完成这个练习。
尝试了一下,用了len*3操作,还是没法把图分开。没忍住,开始追课了,回家整理或者看专利吧。
还是没忍住,看了下一节。原来是x轴的设置,代码见下节。
03绘制多次条形图
# encoding:utf-8
# from ruby in 2019/09/03 20:25
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")
a = ["红海行动", "复仇者联盟3:\n无限战争", "毒液:\n致命守护者", "无问西东"]
y_14 = [36.22, 19.97, 12.34, 7.47]
y_15 = [33.71, 30.75, 25.27, 19.97, ]
y_16 = [18.56, 13.44, 12.63, 7.47]
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.figure(figsize=(30, 15), dpi=80)
# plt.bar(range(len(a)), b, width=0.3)
plt.bar(range(len(a)), y_14, width=bar_width, label="9月14日")
plt.bar(x_15, y_15, width=bar_width, label="9月15日")
plt.bar(x_16, y_16, width=bar_width, label="9月16日")
plt.xticks(x_15, a, fontproperties=my_font)
plt.legend(loc="upper left", prop=my_font)
plt.title("9月14日|15日|16日 三天票房")
plt.show()
关于条形图更多的应用场景:
- 频次统计(市场饱和度)
- 数量统计
05更多的绘图工具的了解
明天再来吧。
讲完这几个基本的图,老师开始总结常见问题及流程。
matplotlib使用的流程总结 :1.明确问题 2.选择图形的呈现方式 3.准备数据 4.绘图和图形完善
在公司的场景应用中,一般不直接用matplotlib去直接展示图,而是使用框架之类的,这里老师举了一个栗子“百度的E-chart”,之前项目遇到过。这里贴链接,感兴趣的小伙伴点进去自看。ECharts Demo
点开一个实例,看看详情。其实之前项目中也有遇见过这之类的需求,用到echart。整体体验来说还是不错的,修改部分代码参数就能展示出比较酷炫的效果。善用框架。
更多的绘图工具 - plotly 可视化工具中的github 相较于matplotlib更加简单。
R语言实现。图形更加漂亮,同时兼容matplotlib和pandas,对着文档写即可。
文档地址:https://plot.ly/python。
好,这部分就跟完了。