matplotlib画折线图
-
假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,27,22,18,15]
代码如下:
# 导入pyplot
from matplotlib import pyplot as plt
# 数据在X轴的位置,是一个可迭代的对象
x = range(2, 26, 2)
# 数据在Y轴的位置,是一个可迭代的对象
# X轴与Y轴的数据个数必须一样,否则会报错
# X轴和Y轴的数据一起组成了所有要绘制出的坐标
# 分别是(2,15),(4,13)...
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 传入x,y,通过pyplot绘制出折线图
plt.plot(x, y)
# 展示图形
plt.show()
结果如下图所示:
-
从图中可以看出,还存在一下几个问题:
-
设置图片大小(想要一个高清大图)
from matplotlib import pyplot as plt
# figure图形图标的意思,在这里就是指我们画的图
# 通过实例化一个figure并且传递参数
# 在图像模糊的时候可以传入dpi参数,让图片更加清晰
fig = plt.figure(figsize=(20, 8), dpi=80)
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()
-
保存到本地
- 使用savefig,plt.savefig(“保存路径文件名”)
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20, 8), dpi=80)
x = range(2, 26, 2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.plot(x, y)
# 保存图片
plt.savefig("./t1.png")
-
描述信息,比如x轴和y轴分别表示什么,这个图表示什么
- x轴的描述信息使用:plt.xlabel()
- y轴的描述信息使用:plt.ylabel()
- 图的描述信息使用:plt.title()
-
设置x或者y轴上数字和字符串对应
- x轴使用:plt.xticks(“数字”,“字符串”)
- y轴使用:plt.yticks(“数字”,“字符串”)
-
显示中文(matplotlib不支持中文显示)
- 从matplotlib中导入font_manager的包
- 查看系统中支持的中文字体
- my_font=font_manager.fontProperties(fname=“字体路径”)
- 在需要使用中文显示的地方加入:fontproperties=my_font
-
线条的样式(比如颜色,透明度等)
- 在绘制的时候指定即可,即在plt.plot()中
- 线条风格:linestyle=’–’
字符 |
线条风格 |
- |
实线 |
– |
虚线 |
-. |
点划线 |
: |
点虚线 |
- 线条粗细:linewidth=5
- 透明度:alpha=0.5
- 设置线条颜色:color=‘r’,也可以使用16进制表示颜色,也可以使用英文。
字符 |
颜色 |
r |
红色 |
g |
绿色 |
b |
蓝色 |
w |
白色 |
-
在一张图中绘制多个折线
-
设置图例
- 绘制多个折线之后,无法看出哪条折线代表什么意思,因此需要使用图例
- 首先在plt.plot()中添加label,区别不同的折线
- plt.legend(prop=my_font,loc="'best")
- 通过prop指定图例的字体
- 通过loc指定图例的位置,默认右上角
-
显示网格
-
例题:如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
y = [random.randint(20,35) for i in range(120)]
from matplotlib import pyplot as plt
import random
from matplotlib import font_manager
# 设置中文显示,fname表示字体的路径。
# 在需要显示中文的地方加上fontproperties = my_font
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
y = [random.randint(20,35) for i in range(120)]
x = range(0, 120)
fig = plt.figure(figsize=(20,8),dpi=80)
_x = list(x)
# _xtick_labels = ["hello,{}".format(i) for i in _x]
_xtick_labels = ["10点{}分".format(i) for i in range(60) ]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
# 让列表x中的数据和_xtick_labels上的数据都传入,最终会在x轴上一一对应显示
# 两组数据的长度必须一样,否则不能完全覆盖整个轴
# [::5]使用列表切片,每隔5个选一个数据进行展示
# rotation=45表示旋转45°,这样字符串之间不会覆盖
plt.xticks(_x[::5], _xtick_labels[::5],rotation = 45, fontproperties = my_font)
plt.xlabel("时间", fontproperties = my_font)
plt.ylabel("温度(ºC)",fontproperties = my_font)
plt.title("10点到12点每分钟温度的变化情况", fontproperties = my_font)
plt.plot(x,y)
plt.show()
结果展示:
- 例题:假设大家在30岁的时候,根据自己的实际情况,统计出来了从11岁到30岁每年交的女(男)朋友的数量如列表a,请绘制出该数据的折线图,以便分析自己每年交女(男)朋友的数量走势
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求:
y轴表示个数
x轴表示岁数,比如11岁,12岁等
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
x = range(11, 31)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
fig = plt.figure(figsize=(20,8), dpi=80)
_x = x
_xtick_labels = ["{}岁".format(i) for i in _x]
plt.xticks(x, _xtick_labels, fontproperties = my_font)
plt.title("11岁到30之间每年交的女朋友数量",fontproperties = my_font)
# 绘制网格
plt.grid(alpha = 0.1)
plt.plot(x, y)
plt.show()
结果展示:
- 例题:假设大家在30岁的时候,根据自己的实际情况,统计出来了你和你同桌各自从11岁到30岁每年交的女(男)朋友的数量如列表a和b,请在一个图中绘制出该数据的折线图,以便比较自己和同桌20年间的差异,同时分析每年交女(男)朋友的数量走势
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
要求:
y轴表示个数
x轴表示岁数,比如11岁,12岁等
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
x = range(11, 31)
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
fig = plt.figure(figsize=(20,8), dpi=80)
plt.plot(x, y_1,label="自己")
plt.plot(x, y_2, label="同桌")
_x = x
_xtick_labels = ["{}岁".format(i) for i in _x]
plt.xticks(x, _xtick_labels, fontproperties = my_font)
plt.title("11岁到30之间每年交的女朋友数量",fontproperties = my_font)
plt.legend(prop = my_font,loc = "best")
# 绘制网格
plt.grid(alpha = 0.5)
plt.show()
结果展示: