- matplotlib是什么?
python底层的绘图工具 - matplotlib的基本要点
- 如何设置图片的大小;
- 如何保存到本地;
- x轴和y轴的描述信息;
- 中文显示乱码问题;
- 调整x轴和y轴的刻度;
- x轴的刻度信息过长, 如何调整?
- 标记最高点;
- matplotlib的折线图, 柱状图, 直方图, 散点图;
上面的点都会在下面的案例中解决
案例
1. 折线图
先写一个最简单的
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 图表的x轴的数据, 是一个可迭代的数据类型
x_times = range(0, 24, 2)
# 图表的y轴的数据, 是一个可迭代的数据类型
y_temp = [15, 12, 13, 20, 23, 30, 15, 12, 13, 20, 23, 30]
# 传入x和y轴的数据, 绘制图形;
plt.plot(x_times, y_temp)
# 保存到本地;
plt.savefig('temp.png')
# 在执行程序时显示图像
# plt.show()
上图中可以看出很多不完美,横坐标刻度等都需要调整
# 案例1: 一天中每隔两个小时气温变化的折线图绘制;
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_times = range(0, 24, 2)
# 图表的y轴的数据, 是一个可迭代的数据类型
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轴的刻度;
# rotation 倾斜角度
# fontproperties 字体
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='', marker='o', edgecolors='r', s=300) #标记
# 2). 如何保存到本地;
plt.savefig('doc/temp.png')
# 在执行程序时显示图像
# plt.show()
在同一个图里面绘制多条折线,
在同一个图里面绘制多条折线,
# color: 线条颜色
# linestyle: 线条的风格
# linewidth: 线条的粗细
# alpha: 透明度
plt.plot(x_age, y_count_1, color='g', linestyle='-.', linewidth=5, alpha=0.5, label="自己")
plt.plot(x_age, y_count_2, color='r', linestyle='--', linewidth=3, alpha=0.3, label="同桌")
添加图例
plt.legend(loc="upper right", prop=titlefont)
添加网格
plt.grid(alpha=0.3)
# 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 ))
2. 散点图
# 传入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)
3. 条形图
# 生成竖向的条形图
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)
多个条形图
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票房数据")
4. 直方图
直方图更多的应用场景:
- 用户年龄的分布状态;
- 一段时间内用户的点击数分布状态;
- 用户活跃时间的分布状态.
# 组距:每个小组里面端点的距离;
# 组数 = 极差 / 组距
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('01_hist.png')