matplotlib绘制折线图基础操作
matplotlib基础绘图
from matplotlib import pyplot as plt
# 导入画图工具包
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
# x,y分别表示数据在x轴和y轴所在的位置,是一个可迭代的对象
plt.plot(x,y) # 传入x和y,通过plot绘制出折线图
plt.show() # 在执行程序时展示图形
设置图片大小
我们想要一个高清无码的大图
fig = plt.figure(figsize = (20,8),dpi = 80)
# fugure表示图形的图标,就是指我们的图
# 通过实例化一个figure并且传递参数,让后台可以自动使用该figure的实例
# 在图像模糊的时候可以传入dpi参数
# dpi---dots per inch 释义为每英寸上点的个数,让图片更加清晰
保存到本地
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
plt.plot(x,y)
plt.save("./sig_size.png") #保存图片
plt.show()
调整x或者y轴刻度的间距
# plt.xticks(x) #设置x轴的刻度
plt.xticks(range(2,25))
plt.yticks(range(min(y),max(y)+1))
输出结果为:
plt.xticks和plt.yticks用来显示x,y坐标轴的刻度值。
具体刻度值的取值可以通过一个列表来表示
我们更改下刻度值如下:
[2.0, 2.5, 3.0, 3.5, 4.0, 4.5, …, 24.0]
fig = plt.figure(figsize=(20,8),dpi = 80)
# 设置图像的大小格式
plt.plot(x,y)
plt.xticks(range(2,25))
plt.yticks(range(min(y),max(y)+1))
# plt.show() # 在执行程序的时候展示图形
# plt.xticks和plt.yticks用来显示x,y坐标轴的刻度值。
# 具体刻度值的取值可以通过一个列表来表示
plt.xticks([i/2 for i in range(4,49)])
# 表示x的刻度值为[2.0,2.5,3.0,3.5,4.0,4.5,...,24.0]
plt.show() # 在执行程序的时候展示图形
输出结果如下:
总结:通过往plt.xticks( )或者plt.yticks( )的括号中传入一个列表参数来刻画x轴或者y轴的刻度值。
当刻度太密集时候,使用列表的步长(间隔)来解决,matplotlib会自动帮我们对应,如:
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
fig = plt.figure(figsize=(20,8),dpi = 80)
# 设置图像的大小格式
plt.plot(x,y)
plt.yticks(range(min(y),max(y)+1))
plt.xticks(([i/2 for i in range(5,49)])[2::2])
plt.show() # 在执行程序的时候展示图形
结果如下:
可以观察上面两幅图中,x轴刻度的起始位置和步长的变化。
解决matplotlib的中文乱码问题
问题:如果列表a表示10点到12点每一分钟的温度,那么如何绘制折线图描绘每一分钟的温度变化情况?
按照题目提示,我们要设定x轴坐标的刻度有两个,分别为:
10点__分 和 11点__分
即需要写伪代码:
plt.xticks([10点1分,10点2分,...,11点58分,11点59分])
接下来就是设定plt.xticks()这个括号中的列表,即设置x轴的刻度:[10点1分,10点2分,…,11点58分,11点59分]。
于是,可以通过遍历和列表的相加操作来实现。
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
通过以上操作,我们将时间分成两段:10点__分和11点__分两种类型,并且表示为列表格式,那么接下来我们试着传递列表参数到plt.xticks(_xtick_labels)中。
此时,会报错。
正确做法如下:
from matplotlib import font_manager
from matplotlib import pyplot as plt
import random
my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
# 插入计算机中现有的中文字体
我们插入之后:
x = range(120)
y=[random.randint(20,35) for i in range(120)]
fig = plt.figure(figsize=(20,8),dpi = 80)
plt.plot(x,y)
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
# 双步长,数字和字符串一一对应,数据的长度一样。
# 双步长,数字和字符串一一对应,数据的长度一样。
plt.xticks(list(x)[::5],_xtick_labels[::5],rotation=45,fontproperties=my_font)
plt.show()
输出结果如下:
rotation=45 表示旋转45度角,这个可以自由更改。
标题、x轴和y轴的描述信息
plt.xlabel('时间',fontproperties = my_font,size=30)
plt.ylabel('温度(℃)',fontproperties = my_font,size=30)
plt.title("10点到12点每分钟的时间变化情况",fontproperties = my_font,size = 30)
输出结果如下:
中文字体在matplotlib中的显示得到完美解决。
线条的样式
实例练习
11岁到30岁的交友数量为列表a,请绘制该数据的折线图,分析自己每年交友数量的走势;
y轴表示个数,x轴表示岁数。
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,1,2,3,4,1,3,1,1,1,1,1,1,1,1,1,1,1,1]
x = range(11,31)
y_1 = a
y_2 = b
fig = plt.figure(figsize=(20,8),dpi = 80)
plt.plot(x,y_1,label = "自己",color = "#ff3399",linestyle = ':',linewidth = '5')
plt.plot(x,y_2,label = "朋友",color = "Cyan",linestyle = '--',linewidth = '5')
# 百度颜色代码,如:#f3399就是设定的颜色
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(list(x),_xtick_labels,rotation=45,fontproperties = my_font,size = 30) # rotation旋转的角度
plt.yticks(range(0,8))
plt.xlabel('年龄',fontproperties = my_font,size=30)
plt.ylabel('交友个数',fontproperties = my_font,size=30)
plt.title("11岁到30岁每年的交友数量变化情况",fontproperties = my_font,size = 30)
# 绘制网格
plt.grid(alpha=0.25) #alpha 透明度,当alpha=1表示完全不透明
# 添加图例
plt.legend(prop=my_font,loc="upper right",fontsize=20)
plt.show()
为每条线添加图例
plt.legend(prop=my_font,loc="upper right",fontsize=20)
plt.show()
设定颜色和线条宽度等
plt.plot(x,y_1,label = "自己",color = "#ff3399",linestyle = ':',linewidth = '5')
plt.plot(x,y_2,label = "朋友",color = "Cyan",linestyle = '--',linewidth = '5')
其中,#ff3399是RGB三原色对应的代码表。
其余颜色可以参照:RGB代码表
给图片添加一个水印(防伪,防止盗用)
# 添加水印
plt.text(x=20, # 水印开头左下角对应的X点
y=5, # 水印开头左下角对应的Y点
s="Hello world", # 水印文本
fontsize=50, # 水印大小
color="#ff0099", # 水印颜色
alpha=0.5) # 水印是通过透明度控制的
plt.show()
输出结果如下:
当然,这是添加英文的水印 “Hello world”
那么,如何添加中文水印呢?
plt.text(x=20, # 水印开头左下角对应的X点
y=5, # 水印开头左下角对应的Y点
s="加个中文水印", # 水印文本
fontsize=50, # 水印大小
color="#ff0099", # 水印颜色
alpha=0.5, # 水印是通过透明度控制的
fontproperties = my_font
)
plt.show()
输出结果如下:
无非是加上这么一句话: fontproperties = my_font 读取一下中文字体的格式。