matplotlib的基本了解
- Matplotlib
- matplotlib是什么?
- matplotlib的基本要点
- matplotlib的折线图, 柱状图, 直方图, 散点图;
- 更多的画图工具
# 1. matplotlib是什么? python底层的绘图工具
# 2. matplotlib的基本要点:
- 如何设置图片的大小;plt.figure(figsize=(X, X))
- 如何保存到本地;plt.savefig()
- x轴和y轴的描述信息;plt.xlabel(),plt.ylabel()
- 中文显示乱码问题;myfont = font_manager.FontProperties(fname=本机文件中文字体)
- 调整x轴和y轴的刻度;plt.xticks
- x轴的刻度信息过长, 如何调整?rotation=45 旋转45度
- 标记最高点;plt.scatter() 散点图取一个点
案例1: 假设一天中每隔两个小时气温变化的折线图绘制;
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 4). 中文显示乱码问题;
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)
# 图表的x轴的数据, 是一个可迭代的数据类型
x_times = range(0, 24, 2)
# 图表的y轴的数据, 是一个可迭代的数据类型
y_temp = [15, 12, 13, 20, 23, 30, 15, 12, 13, 20, 23, 30]
# min(y_temp), max(y_temp)
# 1). 如何设置图片的大小;
plt.figure(figsize=(10, 10))
# 传入x和y轴的数据, 绘制图形;
plt.plot(x_times, y_temp)
# 3). x轴和y轴的描述信息;
plt.title("每天的气温变化(每隔两个小时)",fontproperties=titlefont )
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)
# 5). 调整x轴和y轴的刻度;
# 6). 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)
#
plt.scatter(x_times[2], y_temp[2], color='b')
#color:颜色
#edgecolr0s:点的边框颜色
#marker:标记点设置为是个空心的圈
#s:点的大小
plt.scatter(x_times[2], y_temp[2], color='', marker='o', edgecolors='r', s=300)
# 2). 如何保存到本地;
plt.savefig('doc/temp.png')
# 在执行程序时显示图像
plt.show()
折线图的练习
需求1:
绘制10点到12点每分钟的气温, 如何绘制折线图观察每分钟气温的变化情况?
temps = [random.randint(20, 35) for i in range(120)]
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 中文显示乱码问题;
myfont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=10)
Titlefont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=15)
# 图表的x轴的数据, 是一个可迭代的数据类型
x_times = range(0, 120)
# 图表的y轴的数据, 是一个可迭代的数据类型
y_temp = [random.randint(20, 35) for i in range(120)]
# 设置图片的大小
plt.figure(figsize=(10, 5))
# 传入x和y轴的数据, 绘制图形;
plt.plot(x_times, y_temp)
# x轴和y轴的描述信息;
plt.title("10点到11点温度变化)", fontproperties=Titlefont)
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)
# 调整x轴和y轴的刻度;
#使x轴的刻度为每十分钟显示
_x_labels = ['10时%s分' % i for i in range(60)]
_x_labels += ['11时%s分' % j for j in range(60)]
plt.xticks(x_times[::10], labels=_x_labels[::10], fontproperties=myfont, rotation=45)
#使y轴的刻度为每两度显示
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)
plt.savefig('doc/temp2.png')
plt.show()
需求3:
假设大家30岁时统计出你和你同桌各自从11岁到30岁每年交女(男)朋友的数量如列表a和b,
请在一个图中展示数据折线图,以便比较两人20年之间每年交女(男)朋友的数量走势
**** 在一张图里边画两条折线****
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 中文显示乱码问题;
myfont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=10)
Titlefont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=15)
x_age=range(11,31)
y_count1=[random.randint(0,8) for i in range(20)]
y_count2=[random.randint(0,8) for j in range(20)]
plt.figure(figsize=(10,5))
# 在同一个图里面绘制多条折线,
# color: 线条颜色
# linestyle: 线条的风格
# linewidth: 线条的粗细
# alpha: 透明度
# label:图例标注名称,需要plt.legend调用
plt.plot(x_age,y_count1,color='r',linestyle='-.',linewidth=5,alpha=0.5,label='A')
plt.plot(x_age,y_count2,color='g',linestyle='-',linewidth=4,alpha=0.4,label='B')
# 添加图例
#loc:图例放在哪个位置
plt.legend(loc='upper right',prop=myfont)
# 添加网格
plt.grid(alpha=0.3)
plt.title("11岁至30岁所交男(女)友个数", fontproperties=Titlefont)
plt.xlabel("年龄", fontproperties=myfont)
plt.ylabel("女(男)友数量", fontproperties=myfont)
#设置x轴的标注
plt.xticks(x_age,labels=['%s岁'%i for i in x_age],fontproperties=myfont,rotation=45)
plt.scatter(x_age[0],y_count1[0],color='r',s=300)
plt.scatter(x_age[0],y_count2[0],color='g',s=300)
plt.savefig('doc/fri.png')
plt.show()
难点:
散点图语法
绘制两边分布式x轴坐标
目前难点: 9月的x轴坐标变化
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 中文显示乱码问题;
myfont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=10)
Titlefont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=15)
# 图表的x轴的数据, 是一个可迭代的数据类型
x_march=range(1,32)
x_sep=range(41,71)
# 图表的y轴的数据, 是一个可迭代的数据类型,
# 随即生成一个月温度
y_temp_march=[random.randint(11,30) for i in range(31)]
y_temp_september=[random.randint(20,36) for j in range(30)]
# 设置图片的大小;
plt.figure(figsize=(10,5))
# 传入x和y轴的数据, 绘制图形;
plt.scatter(x_march,y_temp_march,label='3月的温度变化',color='r',alpha=0.5)
plt.scatter(x_sep,y_temp_september,color='g',label='10月的温度变化',alpha=0.5)
# x轴和y轴的描述信息;
plt.title("西安3,9月份每天白天的最高气温随时间(天)变化的散点图", fontproperties=Titlefont)
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)
# 调整x轴和y轴的刻度;
#设置小轴的刻度变化名称
_x_marchlb=['3月%s日'% (i) for i in x_march]
_x_seplb=['9月%s日'%(j-40) for j in x_sep]
#xticks传入的第一个数据要是列表
_x_info=list(x_march)+list(x_sep)
plt.xticks(_x_info[::4],labels=(_x_seplb+_x_marchlb)[::4],fontproperties=myfont,rotation=45)
plt.legend(prop=myfont,loc='upper right')
plt.grid(alpha=0.3)
plt.savefig('doc/temp3.png')
plt.show()
_绘制单个条形图案例_电影票房数据对比图
案例:
假设你获取到了某年内地电影票房前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] 单位:亿
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 中文显示乱码问题;
myfont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=10)
Titlefont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=15)
x_movie=["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸",
"加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归", "蜘蛛侠:英雄归来","悟空传","银河护卫队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] #单位:亿
plt.figure(figsize=(10,5))
# 生成竖向的条形图
#width为每个条形图的宽度
plt.bar(range(len(x_movie)),y_money,color='pink',width=0.5)
# # 生成横向的条形图
#plt.barh(range(len(x_movies)), y_money, color='orange', height=0.7)
# 修改刻度信息的配置
plt.xticks(range(len(y_money)), labels=x_movie, fontproperties=myfont, rotation=45)
#plt.yticks(range(len(y_money)), labels=x_movies, fontproperties=myfont, rotation=45)
# 3). x轴和y轴的描述信息;
plt.title("某年内地电影票房前20的电影和电影票房数据", fontproperties=Titlefont)
plt.xlabel("电影名", fontproperties=myfont)
plt.ylabel("电影票房(单位:亿)", fontproperties=myfont)
plt.savefig('doc/bar.png')
plt.show()
绘制多个条形图案例_三天间电影票房数据对比图
案例:
假设你知道了列表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]
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 中文显示乱码问题;
myfont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=10)
Titlefont = font_manager.FontProperties(fname='/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc', size=15)
x_movie = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
y_16 = [15746,312,4497,319]
y_15 = [12357,156,2045,168]
y_14 = [2358,399,2358,362]
plt.figure(figsize=(10,5))
# 生成竖向的条形图
bar_width = 0.3
x_range = range(len(x_movie))
#第一个参数传入的是索引值列表,是画图开始的位置,依次边历是为了加上宽度,便于对比
plt.bar(x_range,y_14,color='r',width=bar_width,label='14日票房')
plt.bar([i+bar_width for i in x_range],y_15,color='g',width=bar_width,label='15日票房')
plt.bar([i+bar_width*2 for i in x_range],y_16,color='pink',width=bar_width,label='16日票房')
# 修改刻度信息的配置
plt.xticks(range(len(x_movie)), labels=x_movie, fontproperties=myfont, rotation=45)
# 3). x轴和y轴的描述信息;
plt.title("某年内地电影票房前20的电影和电影票房数据", fontproperties=Titlefont)
plt.xlabel("电影名", fontproperties=myfont)
plt.ylabel("电影票房(单位:亿)", fontproperties=myfont)
plt.savefig('doc/bar1.png')
plt.show()
哪些数据可以绘制直方图?
- 连续的数据;
- 没有统计过的数据; ------原始数据
直方图更多的应用场景:
- 用户年龄的分布状态;
- 一段时间内用户的点击数分布状态;
- 用户活跃时间的分布状态.
一个简单的直方图
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/hist1.png')
plt.show(
_美国从家到上班地点所需时间的统计
因为数据离散,所以并不能绘制直方图
图形不需要边框时的设置
from matplotlib import pyplot as plt
# 公司到家的的距离
interval = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90]
# 间距
width = [5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60]
# 对应的人数
quantity = [836, 2737, 3723, 3926, 3596, 1438, 3273, 642, 824, 613, 215, 57]
# 设置图形的大小
plt.figure(figsize=(10, 5))
# 绘制折线图
plt.plot(interval, quantity)
# 设置x轴的刻度
plt.xticks(interval)
# 设置网格
plt.grid(linestyle='-.', alpha=0.5)
# gca====get current axis 获取当前的坐标轴
ax = plt.gca()
# 设置右边框和上边框;
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 设置x轴为下边框
ax.xaxis.set_ticks_position('bottom')
# 设置y轴为作边框
ax.yaxis.set_ticks_position('left')
# 设置x轴和y轴的交点为(0, 0)点;
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0 ))
# 保存图片
plt.savefig('doc/detial.png')
#显示图片
plt.show()