散点图
需求
我们获得北京2016年三月和十月每天白天最高气温,我们现在需要找出气温随时间变化的某种规律。
代码
# 导入库
from matplotlib import pyplot as plt
import random
# 解决中文乱码
import matplotlib
matplotlib.rc("font",family="FangSong")
# 初始化数据
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]
y=y_3+y_10
# 调整画布属性
plt.figure(figsize=(20,8),dpi=200)
# 调整x/y轴的属性
x_3=range(1,32)
x_10=range(51,82)
x=list(x_3)+list(x_10)
x_ticks=["三月{}日".format(i) for i in x_3]
x_ticks+=["十月{}日".format(i-50) for i in x_10]
plt.xticks(x[::2],x_ticks[::2],rotation=45)
plt.yticks(range(min(y),max(y)+1))
# 添加描述信息
plt.xlabel("日期")
plt.ylabel("温度(摄氏度)")
# 绘制散点图
plt.scatter(x_3,y_3,label="三月")
plt.scatter(x_10,y_10,label="十月")
plt.legend()
# 展示散点图
plt.show()
效果
说明
散点图和折线图很多一样,就是把最后的plt.plot
改成plt.scatter
即可
条形图
需求
假如你获取到2017年内地电影票房前20的电影和电影票房数据
第一版
代码
from matplotlib import pyplot as plt
import matplotlib
# 解决中文乱码
matplotlib.rc("font",family="FangSong")
# 初始化数据
x = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归",
"生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
y = [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=200)
# 设置x轴
plt.xticks(range(len(x)),x,rotation=270)
# 绘制条形图
plt.bar(range(len(x)),y,color="b")
plt.show()
效果
说明
和折线图没什么改变,就是在最后绘制时(plt.bar
)传参数时只能传含数字的可迭代对象(说人话就是,传一个数字列表,对应x轴和y轴数据)
第二版
代码
from matplotlib import pyplot as plt
import matplotlib
# 解决中文乱码
matplotlib.rc("font",family="FangSong")
# 初始化数据
x = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归",
"生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
y = [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=200)
plt.yticks(range(len(x)),x)
# 将图形横过来
plt.barh(range(len(x)),y,height=0.3,color="orange")
# 设置网格
plt.grid(alpha=.4)
plt.show()
效果
说明
把图形横过来数据会更加直观,我们只需要将plt.ba
r改成plt.barh
即可
进阶练习
需求
假设你知道四个电影分别在2017-09-14,2017-09-15,2017-09-16三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况。
代码
from matplotlib import pyplot as plt
import matplotlib
# 解决中文乱码
matplotlib.rc("font",family="FangSong")
# 初始化数据
x = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
y_16 = [15746,312,4497,319]
y_15 = [12357,156,2045,168]
y_14 = [2358,399,2358,362]
plt.figure(figsize=(20,8),dpi=200)
# 设置偏移量
bar_width=0.2
# 设置每个日期条形块的位置
# x_14在最左边,然后x_15在x_14右边,x_16在x_15右边,依次偏移
x_14=list(range(len(x)))
x_15=[i+bar_width for i in x_14]
x_16=[i+bar_width*2 for i in x_14]
# 设置x轴刻度
plt.xticks(x_15,x)
# 绘制条形图,因为有三个日期,所以要绘制三次
plt.bar(x_14,y_14,width=bar_width,label="九月十四日")
plt.bar(x_15,y_15,width=bar_width,label="九月十五日")
plt.bar(x_16,y_16,width=bar_width,label="九月十六日")
# 设置标签
plt.xlabel("电影")
plt.ylabel("票房")
plt.title("九月十四日至十六日电影票房变化")
plt.legend()
plt.show()
效果
说明
这个条形图有点复杂,主要是画三个条形图在一张画布上。我们要设置每个条形图的偏移量,使得这些条形图不重叠