matplotlib折线图
假设一天中每隔两个小时的气温(℃)分别是[15,13,14.5,17,20,25,26,26,27,22,18,15], 画出对应的气温折线图
# 导入库
from matplotlib import pyplot as plt# 传入x轴和y轴数据, 是一个可迭代对象
# x轴和y轴的数据一起组成了所有要绘制出来的坐标
x = range(2, 26, 2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]# 传入数据, 绘制折线图
plt.plot(x, y)# 展示图形
plt.show()
但是目前存在以下几个问题:
- 设置图片大小(想要一个高清无码大图)
- 保存到本地
- 描述信息,比如x轴和y轴表示什么,这个图表示什么
- 调整x或者y的刻度的间距
- 线条的样式(比如颜色,透明度等)
- 标记出特殊的点(比如告诉别人最高点和最低点在哪里)
# figsize设置图片大小
# dpi参数能控制清晰度
fig = plt.figure(figsize=(20, 8), dpi=80)plt.plot(x, y)
# 保存图片
# 也可以保存为svg这种矢量图格式, 放大不会有锯齿
plt.savefig("line_chart.png")
plt.show()
fig = plt.figure(figsize=(10, 5))plt.plot(x, y)# 设置x轴刻度
# 将所有的x都作为x轴刻度
# plt.xticks(x)# 将[2, 26)每隔1作为x轴刻度
# plt.xticks(range(2, 26))# 将[2, 26)每隔0.5作为x轴刻度
# 这样子刻度会过于密集
# xticks_labels = [i/2 for i in range(4, 49)]
# plt.xticks(xticks_labels)# 刻度太密集时可以使用列表的步长来解决
# x[::2]表示在列表x中间隔为2取值
plt.xticks(x[::2])# 设置y轴刻度
plt.yticks(range(min(y), max(y) + 1))plt.show()
如果列表a表示10点到12点的每一分钟的气温, 如何绘制折线图观察每分钟气温的变化情况?
from matplotlib import pyplot as plt
import randomplt.figure(figsize=(20, 8))x = range(120)
y = [random.uniform(20, 35) for i in range(120)]plt.plot(x, y)# 设置x轴刻度字符串
x_ticks = ["10:{}".format(i) for i in x if i < 60]
x_ticks += ["11:{}".format(i - 60) for i in x if i>60]# 必须同时传入列表x中的数据和x_ticks的数据, 最终会在x轴上一一对应显示
# 两组数据的长度必须一样, 否则不能完全覆盖整个坐标轴
# 使用列表切片每隔5个数据展示一次
# 为了让字符串不会覆盖, 让字符串旋转90度显示
plt.xticks(x[::5], x_ticks[::5], rotation=90)plt.show()
plt.figure(figsize=(20, 8))
plt.plot(x, y)
plt.xticks(x[::5], x_ticks[::5], rotation=90)# 添加x轴, y轴标签以及图形标题
plt.xlabel("time")
plt.ylabel("temperature")
plt.title("Temperature changes per minute")plt.show()
假设大家在30岁的时候, 根据自己的实际情况, 统计出来了从11岁到30岁每年交的女(男)朋友的数量如列表a, 请绘制出该数据的折线图, 以便分析自己每年交女(男)朋友的数量走势
from matplotlib import pyplot as pltx = range(11, 31)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]plt.plot(x, y)
plt.xticks(x)
plt.yticks(y)# 绘制网格, 并设置透明度
plt.grid(alpha=0.4)plt.show()
# 找出最高点和最低点的坐标
max_y = max(y)
min_y = min(y)
max_idx = y.index(max_y)
min_idx = y.index(min_y)
max_x = x[max_idx]
min_x = x[min_idx]plt.plot(x, y)
plt.xticks(x)
plt.yticks(y)
plt.grid(alpha=0.4)# 标记出最高的点和最低的点
plt.scatter(max_x, max_y, color='red', label='Max points')
plt.scatter(min_x, min_y, color='green', label='Min points')
# 指定图例位置
plt.legend(loc="best")plt.show()
假设大家在30岁的时候, 根据自己的实际情况, 统计出来了你和你同桌各自从11岁到30岁每年交的女(男)朋友的数量如列表a和b, 请在一个图中绘制出该数据的折线图, 以便比较自己和同桌20年间的差异, 同时分析每年交女(男)朋友的数量走势
x = range(11, 31)
y1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]'''
自定义绘制图形风格
plt.plot(x, y,label="" 添加图例color='r' 线条颜色 r红色 g绿色 b蓝色 w白色 c青色 m洋红 y黄色 还可以用16进制RGB linestyle='--' 线条风格 -实线 --虚线 -.点划线 :点虚线linewidth=5 线条粗细alpha=0.5 透明度
)
'''# 绘制多个图形plot多次即可
plt.plot(x, y1, label="self", linestyle='--', color='r', alpha=0.5)
plt.plot(x, y2, label="calssmate", linestyle='-', color='b', alpha=0.5)plt.xticks(x)
plt.grid(alpha=0.5)
# 通过legend(loc)指定图例的位置, 默认右上角
# best, upper right, upper left, lower right, lower left, right, center left, center right, lower center, upper center, center
plt.legend(loc="best")
plt.show()