python数据整理--绘图工具matplotlib

1. matplotlib是一种python底层的绘图工具。

我们可以将爬虫爬取的数据,来进行分析绘制成更直观的图像,便于分析与整理。

2. matplotlib的基本要点:

(1). 如何设置图片的大小;
(2). 如何保存到本地;
(3). x轴和y轴的描述信息;
(4). 中文显示乱码问题;
(5). 调整x轴和y轴的刻度;
(6). x轴的刻度信息过长,如何调整?
(7). 标记最高点;

3.绘制图形种类:

折线图(plot),散点图(scatter),条形图(bar为竖向,brah为横向),直方图(hist)

折线图案例1:假设一天中每隔两小时气温变化的折线图绘制;

from matplotlib import pyplot as plt ,font_manager
# 给定字体用来解决中文乱码问题(fname可以通过在命令行输入fc-list :lang=zh获取)
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=25)
# 模拟真实的x轴数据
x_times=range(0,24,2)
# 模拟真实的x轴数据
y_temp=[15, 12, 13, 20, 23, 30, 15, 12, 13, 20, 23, 30]

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

# 通过x轴y轴数据绘制图像
plt.plot(x_times,y_temp)

# 添加x,y轴以及标题的描述信息,以及规定字体。
plt.title('每天的气温变化(每隔两小时)',fontproperties=titlefont)
plt.xlabel('时间',fontproperties=myfont)
plt.ylabel('温度',fontproperties=myfont)

# 调整x,y轴的刻度(让图上的每个点都在x,y轴上显示对应的刻度,而且刻度单位与实际情况一致,ratation是旋转,当轴上标注内容过多,可能会出现重叠,导致信息不清楚,可以旋转来达到信息清晰。)
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')
plt.scatter(x_times[2],y_temp[2],color="",market='o',edgecolors='r',s=300)

# 绘制背景网格(alpha为透明度)
plt.grid(alpha=0.3)

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

在这里插入图片描述

折线图案例2:绘制10点到12点每分钟气温变化

from matplotlib import pyplot as plt, font_manager

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=25)

# 模拟真实的x轴,y轴数据
x_times=range(120)
y_temp=[random.randint(15,30) for i in range(120)]
# 图片大小
plt.figure(figsize=(20,20))

# 绘制图片
plt.plot(x_times,y_temp)

# x,y轴与标题描述
plt.title("10点到11点温度变化)",fontproperties=titlefont )
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)

# x轴刻度
x_labels=['10时%s分' %(i) for i in range(0,60,10)]
x_labels+=['11时%s分' %(i) for i in range(0,60,10)]
plt.xtick(x_times[::10],labels=x_labels,fontproperties=myfont,rotation=45)
y_temp_range=range(min(y_temp),max(y_temp)+1,2)
plt.xticks(y_temp_range,labels=['%s。C' %(i) for i in y_temp_range],fontproperties=myfont)

# 保存
plt.savefig('doc/temp2.png')

在这里插入图片描述

散点图绘制案例:3,10月份每天白天气温随时间变化的散点图

from matplotlib import pyplot as plt
from matplotlib import font_manager

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_march = range(1, 32)
x_oct = range(50, 81)

# 图表的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]

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

# 绘制两份图形
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)

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

# 调整x轴和y轴的刻度
_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)

plt.legend(prop=myfont, loc="upper left")
plt.grid(alpha=0.5)

# 保存
plt.savefig('doc/scatter.png')

在这里插入图片描述

单个条形图绘制案例:电影票房数据对比

from matplotlib import pyplot as plt
from matplotlib import font_manager

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)

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, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
x_movies = ["流浪地球%s" %(i) for i in range(len(y_money))]

# 设置图片的大小
plt.figure(figsize=(30, 10))
# (1,2)  -====('a', 10)
# 生成竖向的条形图
plt.bar(range(len(x_movies)), y_money, color='yellow', width=0.5)
# # 生成横向的条形图
# plt.barh(range(len(x_movies)), y_money, color='orange', height=0.7)

# 修改刻度信息
# 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)

# x轴和y轴的描述
plt.title("某年内地电影票房前20的电影和电影票房数据", fontproperties=titlefont)
plt.xlabel("电影名", fontproperties=myfont)
plt.ylabel("电影票房(单位:亿)", fontproperties=myfont)
# 保存
plt.savefig('doc/bar.png')

在这里插入图片描述

多重条形图绘制案例:三天内电影票房对比

from matplotlib import pyplot as plt
from matplotlib import font_manager
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_movies_name = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"]
y_16 = [15746, 312, 4497, 319]
y_15 = [12357, 156, 2045, 168]
y_14 = [2358, 399, 2358, 362]

plt.figure(figsize=(30, 10))

# 生成竖向的条形图
bar_width = 0.3  # 条形的宽度
x_range = range(len(x_movies_name))

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='blue', width=bar_width, label="2017-09-15票房数据")
plt.bar([i + bar_width * 2 for i in x_range], y_16, color='red', width=bar_width, label="2017-09-16票房数据")

# 更改x轴上的刻度
plt.xticks(range(len(x_movies_name)), labels=x_movies_name, fontproperties=myfont, rotation=45)

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

# 保存
plt.savefig('doc/bar.png')

在这里插入图片描述

直方图案例:电影时长分布

import random
from matplotlib import  pyplot as plt
# 模拟爬取的y轴数据
y = [random.randint(60,180) for i in range(250)]

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

直方图案例:电影的时长分布设置组数

import random
from matplotlib import pyplot as plt

# 250个分布在60-180之间的数据 x为(60-180),所有y之和为250
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])

# 绘制网格,linestyle网格线的格式
plt.grid(linestyle='-.', alpha=0.3)

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

在这里插入图片描述

问题

如果图中x或者y轴的0刻度与直角坐标器出现不重合怎么办,解决方法:

# 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 ))

猜你喜欢

转载自blog.csdn.net/qq_37037438/article/details/87888461