python中matplotlib模块的使用

matplotlib是python底层的绘图工具
我们通过案例来详解是如何使用matplotlib模块的。

1.折线图:

一天中每隔两个小时气温变化的折线图绘制
from matplotlib import pyplot as plt 
from matplotlib import font_manager

# 图表的x轴的数据, 为12个小时(必须是一个可迭代的数据类型)
x_times = range(0, 24, 2)
# 图表的y轴的数据,为12个小时的温度( 必须是一个可迭代的数据类型)
y_temp = [15, 12, 13, 20, 23, 30, 15, 12, 13, 20, 23, 30]

# 1.设置图片大小
plt.figure(figsize=(10,10))

# 2.传入x轴和y轴的数据,绘制图形
plt.plot(x_times,y_temp)

# 3.设置x轴,y轴,和图片的描述信息
plt.title("每天的气温变化(每隔两个小时)")
plt.xlabel("时间")
plt.ylabel("温度")

# 4.在执行程序时显示图像
plt.show()

# 5.保存到本地
plt.savefig('doc/temp.png')

执行完上述程序后在doc下会产生temp.png图片(即下图)
在这里插入图片描述
但这张图片的横纵坐标和图片标题的描述信息为乱码,并且横坐标的刻度也不是以两个小时分隔开的。下面我们就来解决这两个问题。

1.解决中文显示乱码问题

myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18) 
# fname参数为系统当前支持的中文
# size为字体大小
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24) 

# 将上面代码中的第三步添加fontproperties参数,即为:
plt.title("每天的气温变化(每隔两个小时)",fontproperties=titlefont )
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)

2.调整x轴和y轴的刻度,并且当x轴的刻度信息过长, 如何调整?

# 第一个参数可以传一个列表,可以将横坐标等分
# labels参数为刻度的描述
# fontproperties参数设置解决中文乱码
# rotation参数可以将刻度表述旋转角度(在x轴的刻度信息过长时使用)
plt.xticks(x_times,labels=["%s时0分"%(i) for i in x_times], fontproperties=myfont, rotation=45)
y_temp_range = range(min(y_temp), max(y_temp)+1, 2)
plt.yticks(y_temp_range, labels=["%s 。C"%(i) for i in y_temp_range], fontproperties=myfont)

这是重新运行后的temp.png图片
在这里插入图片描述

2.散点图

绘制北京3,10月份每天白天的最高气温随时间(天)变化的散点图

数据来源:天气网 http://lishi.tianqi.com/beijing/index.html
a = [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]
b = [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]
散点图和折线图的程序差不多,只需要改变上述代码的第二步及改为:

# plt.scatter()用于绘制散点图
plt.scatter(x_march, y_temp_march, label="3月的温度变化", color='r', alpha=0.5)
plt.scatter(x_oct, y_temp_oct, label="10月的温度变化", color='g', alpha=0.5)

完整代码如下:

from matplotlib import pyplot as plt
from matplotlib import font_manager

# 1.中文显示乱码问题;
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)

# 2.图表数据
# 图表2的x轴的数据, 是一个可迭代的数据类型
x_march = range(1, 32)
x_oct = range(50, 81)

# 图表1的y轴的数据, 是一个可迭代的数据类型
y_temp_march = [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_temp_oct = [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]

# 3.设置图片的大小
plt.figure(figsize=(30, 10))

# 4.传入x和y轴的数据, 绘制图形;
plt.scatter(x_march, y_temp_march, label="3月的温度变化", color='r', alpha=0.5)
plt.scatter(x_oct, y_temp_oct, label="10月的温度变化", color='g', alpha=0.5)

# 5. x轴和y轴的描述信息;
plt.title("北京3,10月份每天白天的最高气温随时间(天)变化的散点图", fontproperties=titlefont)
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)

# 6. 调整x轴和y轴的刻度; x轴的刻度信息过长, 如何调整?
_x_info = list(x_march) + list(x_oct)
_x_labels_march = ["3月%s日" % (i) for i in x_march]
_x_labels_oct = ["10月%s日" % (i - 49) for i in x_oct]  # range(50, 81)
plt.xticks(_x_info[::3], labels=(_x_labels_march + _x_labels_oct)[::3], fontproperties=myfont, rotation=45)

# 7.添加图例
plt.legend(prop=myfont, loc="upper left")

# 8.添加表格
plt.grid(alpha=0.5)

# 9. 保存到本地;
plt.savefig('doc/scatter.png')

# 10.在执行程序时显示图像
plt.show()

结果:
在这里插入图片描述

3.条形图

绘制单个条形图

假设你获取到了某年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?

a = ["战狼2”,"速度与激情8”,"功夫瑜伽”,"西游伏妖篇”,"变形金刚5:最后的骑士”,"摔跤吧!爸爸”,
"加勒比海盗5:死无对证”,"金刚:骷髅岛”,"极限特工:终极回归”, "侠:英雄归来”,"悟空传”,"银河护卫队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]

条形图和散点图的程序差不多,只需要改变上述代码的第四步,即改为:

# 生成竖状条形图
plt.bar(range(len(x_movies)), y_money, color='orange', width=0.5)

# 生成横向条形图
plt.barh(range(len(x_movies)), y_money, color='orange', height=0.7)
from matplotlib import pyplot as plt
from matplotlib import font_manager

# 1.中文显示乱码问题;
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)

# 2.数据信息
y_money = [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]
x_movies = ["战狼2","速度与激情8", "功夫瑜伽",
     "西游伏妖篇", "变形金刚5:最后的骑士",
     "摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛", "极限特工:终极回归",
     "侠:英雄归来", "悟空传","银河护卫队2", "情圣","新木乃伊"]

# 3.设置图片的大小;
plt.figure(figsize=(30, 10))

# 4.生成竖向的条形图
plt.bar(range(len(x_movies)), y_money, color='orange', width=0.5)
# # 生成横向的条形图
# plt.barh(range(len(x_movies)), y_money, color='orange', height=0.7)

# 5.修改刻度信息的配置(竖向条形图)
plt.xticks(range(len(y_money)), labels=x_movies, fontproperties=myfont, rotation=45)
# 横向条形图
# plt.yticks(range(len(y_money)), labels=x_movies, fontproperties=myfont, rotation=45)

# 6.x轴和y轴的描述信息;
plt.title("某年内地电影票房前20的电影和电影票房数据", fontproperties=titlefont)
plt.xlabel("电影名", fontproperties=myfont)
plt.ylabel("电影票房(单位:亿)", fontproperties=myfont)

# 7.保存到本地
plt.savefig('doc/bar.png')

结果:
竖向条形图:
在这里插入图片描述
横向条形图:
在这里插入图片描述

绘制多个条形图

假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)
三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?

a = ["猩球崛起3:终极之战”,"敦刻尔克”,"蜘蛛侠:英雄归来”,"战狼2”]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]

多个条形图相比于单个条形图只是在生成条形图时做了改变:

bar_width = 0.3
plt.bar(x_range, y_14, color='green', width=bar_width, label="2017-09-14票房数据")
plt.bar([i + bar_width for i in x_range], y_15, color='red', width=bar_width, label="2017-09-15票房数据")
plt.bar([i + bar_width * 2 for i in x_range], y_16, color='orange', 
width=bar_width, label="2017-09-16票房数据")

完整代码:

from matplotlib import pyplot as plt
from matplotlib import font_manager

# 1.中文显示乱码问题;
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)

# 2.数据信息
x_movies_name = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"]
y_16 = [15746, 312, 4497, 319]
y_15 = [12357, 156, 2045, 168]
y_14 = [2358, 399, 2358, 362]

# 3.设置图片的大小;
plt.figure(figsize=(30, 10))

# 4.生成竖向的条形图
bar_width = 0.3

x_range = range(len(x_movies_name))
# ['a', 'b', 'c', 'd'] ===== [0, 1,2,3]
# [1,2,3,4]
# [3,4,4,4]

# [(0, 1), (1, 2), (2, 3), (3, 4)]
# [(0+0.3, 1), (1+0.3, 3)]

plt.bar(x_range, y_14, color='green', width=bar_width, label="2017-09-14票房数据")
plt.bar([i + bar_width for i in x_range], y_15, color='red', width=bar_width, label="2017-09-15票房数据")
plt.bar([i + bar_width * 2 for i in x_range], y_16, color='orange', width=bar_width, label="2017-09-16票房数据")

# 5.添加图例
plt.legend(prop=myfont, loc="upper right")

# 6.修改刻度信息的配置
plt.xticks(range(len(x_movies_name)), labels=x_movies_name, fontproperties=myfont, rotation=45)

# 7. x轴和y轴的描述信息;
plt.title("某年内地电影票房前20的电影和电影票房数据", fontproperties=titlefont)
plt.xlabel("电影名", fontproperties=myfont)
plt.ylabel("电影票房(单位:亿)", fontproperties=myfont)

# 8.保存到本地
plt.savefig('doc/bar1.png')

结果:在这里插入图片描述

直方图

250部电影的时长, 电影时长的分布状态;

把数据分为多少组进行统计?
- 如果数据在100个以内, 一般分为5-12组;
- 组距:每个小组里面端点的距离;
组数 = 极差 / 组距

import random
from matplotlib import pyplot as plt

y = [random.randint(60, 180) for i in range(250)]

d = 10  # 组距
# 组数
num_bins = (max(y) - min(y)) // d

# 设置x轴的刻度范围,
plt.xticks(list(range(min(y), max(y) + d))[::d])

plt.grid(linestyle='-.', alpha=0.3)

# 直方图绘制数据分为20个分组;
plt.hist(y, num_bins)
plt.savefig('doc/02_hist.png')

在这里插入图片描述

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页