今天来学习学习matplotlib
,它是一个绘图库,可以绘制折线图,直方图…,是根据matlab
而来的。编不下去了
初步绘制
好了,正题开始
拿一个例子来讲把
比如这里有一组数据,是一天之内的气温变化,每两个小时测一次温度
温度变化 [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
现在我想绘制一个折线图,更直观的反映温度变化
那么我们开始把
直接上源码
from matplotlib import pyplot as plt
x = range(2,25,2) # 取不到25
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
#绘图
plt.plot(x,y)
#显示
plt.show()
虽然代码很简单,我还是简单的提一提吧
第一行是导入相应的模块,as 是取一个别名,plt 就是 pyplot
range(start,end,step) ----> 起始点,终点, 步长,但是取不到终点,是开区间
程序运行起来是这个亚子的,生成这么一个图片
好了,大功告成
谢谢大家观看,收工了,告辞
存在一些问题
但是这图也太难看了吧,给别人谁看得懂,我们可以再添一点东西
目前存在以下问题:
1、设置图片的大小(想要一个高清无码大图)
2、保存到本地
3、描述信息,比如x轴和y轴表示什么,这个图表示什么
4、调整x或者y的刻度的间距
5、线条的样式,比如颜色,透明度等
6、标记出特殊的点,比如告诉别人最高点和最低点在哪里
7、给图片添加一个水印,防伪,防止盗用
设置图片大小
接下来介绍这么一个方法解决图片大小问题,还可以调节清晰程度
这需要用到一个函数figure()
还是直接上源码吧QAQ
from matplotlib import pyplot as plt
x = range(2,25,2) # 取不到25
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
# 设置图片大小及清晰度
plt.figure(figsize=(20,8),dpi=80)
# 绘图
plt.plot(x,y)
# 显示
plt.show()
figsize=(20,8)意思是设置图片长为20,宽为8
dpi就是dotpixel,点像素的意思,dpi=80意思就是每英寸有80个像素点,可以保持图片放大的时候可以依然很清晰,当然不一定是80了,可以根据自己的需求设置
程序运行是这个亚子
保存到本地
有时候我们绘制了一个图,想把它变成一张图片,保存到本地
就是一个简单的savefig()
函数,参数传入要保存的路径就好了
源代码源代码QAQ,我这里是保存到本目录,命名为1.png
from matplotlib import pyplot as plt
x = range(2,25,2) # 取不到25
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
# 设置图片大小及清晰度
plt.figure(figsize=(20,8),dpi=80)
# 绘图
plt.plot(x,y)
# 保存到本地
plt.savefig('./1.png')
# 显示
plt.show()
要注意保存到本地,应该是在描绘之后再保存
调整x轴或者y轴的刻度
不知道大家有没有发现,这个温度是每隔2小时测一次,但是描绘的x轴坐标间距并不是2,而是它自己生成的5
如果我们想自己设定间距呢?又该如何做
这里又有新知识点
这次介绍的一个函数是 xticks()
比如我想让刻度间距为1
那么可以这样(有些东西我就注释了)
from matplotlib import pyplot as plt
x = range(2,25,2)
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
# 设置图片大小及清晰度
# plt.figure(figsize=(10,8),dpi=80)
# 绘图
plt.plot(x,y)
# 设置x轴的刻度
x_ticks = [i for i in range(2,25)]
plt.xticks(x_ticks)
# 保存到本地
# plt.savefig('./1.png')
# 显示
plt.show()
它是这个亚子的
能不能再缩小间距,当然可以
所以我令x_ticks = [i for i in range(2,25,0.5)]
, 让间距变成0.5
但是这是不行的,问题就出在range里面的步长,它不能为浮点数
所以我这样写 x_ticks = [i/2 for i in range(4,50)]
, 这是可以的
还可以对x_ticks再次取步长
# 设置x轴的刻度
x_ticks = [i/2 for i in range(4,50)]
plt.xticks(x_ticks[::3])
是这个亚子的
y轴也是一样的,我们可以对y轴的刻度这样设置, 只是函数变成了 yticks()
我们可以根据y轴的最小值和最大值设定
# 调整y轴的刻度
y_ticks = [range(min(y),max(y)+1)] # 因为是取不到max(y),所有再+1
plt.yticks(y_ticks)
这个亚子
================================ 我是优雅的分界线 ===============================================
现在问题升级
如果列表 y 表示10点到12点的每一分钟的气温,如何绘制折现图观察每分钟气温的变化情况?
y = [rando.randint(20,35) for i in range(120)]
很明显这 y 是一个随机数,反正图很沙雕,是不是气温已经不重要了
我们可以写如下程序
from matplotlib import pyplot as plt
import random
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
# 设置图片大小及清晰度
plt.figure(figsize=(12,8),dpi=100)
# 绘图
plt.plot(x,y)
# 显示
plt.show()
是这个亚子的
它横坐标表示的是120分钟
我们发现这并不直观
我有一个大胆的想法,把x刻度变成字符串,而不仅仅是数字
看看这该如何实现
我们先来简单的测试一下
from matplotlib import pyplot as plt
import random
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
# 设置图片大小及清晰度
plt.figure(figsize=(12,8),dpi=100)
# 绘图
plt.plot(x,y)
# 调整x轴的刻度
x_labels = ["hello,{}".format(i) for i in x]
plt.xticks(x,x_labels)
# 显示
plt.show()
是这个亚子的
下面什么鬼,密密麻麻的
别着急,是因为太密集了
我们来让它变的稀疏一点
from matplotlib import pyplot as plt
import random
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
# 设置图片大小及清晰度
plt.figure