python中的matplotlib库的基本使用
matplotlib库
使用matplotlib制作各种图表,可以访问https://matplotlib.org/的示例,点击示例图表,就可以查看用于生成图表的代码。
以下matplotlib库简称为matp。
绘制简单的折线图并设置线条粗细
# https://matplotlib.org/
import matplotlib.pyplot as plt
# 等价于 from matplotlib import pyplot as plt
# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体字体
# 解决负号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
squres = [1, 4, 9, 16, 25]
plt.plot(squres, linewidth=5)
# 设置图表标题 并给坐标轴加上标签
plt.title('squers数据', fontsize=24)
plt.xlabel('值',fontsize=14)
plt.ylabel('square的值', fontsize=14)
# 设置刻度标记大小
plt.tick_params(axis='both', labelsize=14)
plt.show()
import matplotlib.pyplot as plt 这句话是引入matp库中的pyplot模块,并指定别名。
plt.show()是打开matp查看器。
plt.xlabel设置x轴下方的文字标题。
plt.ylabel设置Y轴左侧的文字标题。
plt.title:为图表指定标题
linewidth参数决定了plot()绘制线条的粗细
plt.tick_params(axis='both', labelsize=14):刻度样式,axis='both'指定的实参将影响X轴和Y轴上的刻度(both),并将刻度标记的字号设置为14。
plt.rcParams['font.sans-serif']=['SimHei']和plt.rcParams['axes.unicode_minus']=False比较关键(中文支持),如果不加这两句,那么会发现图表标题和XY轴的标题中的中文都是显示方块的,所以需要添加中文的支持。
校正图形
当向plot()提供一系列数字时候,它假设第一个数据点对应的x坐标值是0,但是我们第一个点对应的x值为1.为改变这种默认行为,我们可以给plot()同时提供输入值和输出值。
input_values = [1, 2, 3, 4, 5]
squres = [1, 4, 9, 16, 25]
plt.plot(input_values, squres, linewidth=5)
因为同时提供了输入值和输出值,它无需对输出值的生成方式做出假设,
使用scatter绘制散点图
要绘制单个点,可使用函数scatter()。传入一对xy坐标,它将在指定位置绘制一个点。
import matplotlib.pyplot as plt
plt.scatter(2, 4, s=200)
# 设置图表标题并给坐标加上标签
plt.title('图表标题', fontsize=24)
plt.xlabel('x轴', fontsize=14)
plt.ylabel('y轴', fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
scatter的实参S设置了绘图时使用点的尺寸。因为只传入了一个坐标,所以图中此时只有一个点。
绘制一系列点
x_values = [1,2,3,4,5]
y_values = [1,4,9,16,25]
plt.scatter(x_values, y_values, s=200)
绘制一系列点,向scatter传递两个包含xy值的列表。其要绘制的点分别为(1,1)(2,4)(3,9)...(5,25)
像这种计算平方的,我们可以使用自动计算:
x_values = list(range(1, 1001))
y_values = [ x**2 for x in x_values ]
plt.scatter(x_values, y_values, s=40)
...
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
x_values:创建一个包含数字1-1000的列表
y_values:遍历x值,并计算其平方值,结果存储在y_values中
plt.axis():指定了每个坐标轴的取值范围。axis要求提供四个值:xy坐标轴的最小值和最大值。这里我们将x坐标轴的取值范围设置为0-1100,y轴取值范围设置为0-1100000。
matp默认蓝色点和黑色轮廓。当绘制很多点时候,黑色轮廓可能会连在一起,要去掉数据点轮廓:
plt.scatter(x_values, y_values, edgecolor='none', s=40)
plt.scatter(x_values, y_values, edgecolor='black', s=40)
实参edgecolor='none'可以去掉黑色轮廓。(2.0.0版本的matp默认没有黑色轮廓,edgecolor默认为none)
要修改数据点颜色,可以向scatter传递参数c,并设置其为要使用的颜色名称或者色值。
plt.scatter(x_values, y_values, c="#666", edgecolor='none', s=40)
plt.scatter(x_values, y_values, c="red", edgecolor='none', s=40)
同样的还可以使用RGB定义颜色,但是此时的参数不是字符串了,而是一个元组。
plt.scatter(x_values, y_values, c=(0,0,0.8), edgecolor='none', s=40)
值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅。
上面这个可能会报警告,建议改为如下,使用color,将c
参数替换为color
参数,这样可以明确告诉matplotlib
你想要使用单一颜色。
plt.scatter(x_values, y_values, color=(0, 0, 0.8), edgecolor='none', s=40)
使用颜色映射
颜色映射是一系列颜色,从起始颜色渐变到结束颜色,在可视化中,颜色映射用于突出数据的规律。比如用浅色显示较小的值,用深色显示较大的值。
x_values = list(range(1, 1001))
y_values = [ x**2 for x in x_values ]
plt.scatter(
x_values,
y_values,
c=y_values,
cmap=plt.cm.Blues,
edgecolor='none',
s=40
)
# 设置图表标题并给坐标加上标签
plt.title('图表标题', fontsize=24)
plt.xlabel('x轴', fontsize=14)
plt.ylabel('y轴', fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
我们执行会发现,颜色从左到右是由浅入深的。模块pyplot内置了一组颜色映射,要使用这些颜色映射,你需要告诉pyplot该如何设置数据集中每个点的颜色。上面例子演示了如何根据每个点的y值来设置其颜色。
参数C设置成了一个y值列表,使用参数cmap告诉pyplot使用哪个颜色映射,最终将y值较小的显示为浅蓝色,y值较大的显示为深蓝色。
可以参考:https://matplotlib.org/stable/users/explain/colors/index.html#tutorials-colors 官网的examples中查找colormaps_reference
自动保存图表
要让程序自动将图表保存到文件中,将plt.show() 调用替换为plt.savefig():
# plt.show()
plt.savefig('squares_plot.png', bbox_inches='tight')
第一个参数指定要用什么样的文件名保存图表,会在脚本目录中生成文件;
bbox_inches指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,可以省略这个实参。
随机漫步
在目录下创建random_walk.py文件,并编写RandomWalk类。
# 随机漫步
from random import choice
class RandomWalk():
""" 生成随机漫步数据的表 """
def __init__(self, num_points=5000):
self.num_points = num_points
#所有随机漫步都始于(0,0)
# [0] 是一个包含单个元素 0 的列表
self.x_values = [0]
self.y_values = [0]
def fill_walk(self):
""" 计算随机漫步包含的所有点 """
# 不断漫步 直到列表达到指定长度(模拟四种漫步决定 向右 向左 向上 向下 并且沿指定方向走多远)
while len(self.x_values) < self.num_points:
# 方向 决定前进方向以及沿这个方向前进的 向右=1,向左=-1
# choice([1, -1]) 在1,-1中随机返回一个值
x_direction = choice([1, -1])
# 距离 随机选择0-4之间的整数 表示沿指定方向走多远
# choice([..]) 从列表中随机返回一个值
x_distance = choice([0, 1, 2, 3, 4])
# 方向 * 距离 确定沿x或者Y轴走的步数(距离数)
# 如果x_step为正 则向右移动 负数 则代表向左移动 0则代表垂直移动
x_step = x_direction * x_distance
y_direction = choice([1, -1])
y_distance = choice([0, 1, 2, 3, 4])
y_step = y_direction * y_distance
# 拒绝原地踏步
# 如果x和y同时为0 则不被允许 直接continue进行下一次循环
if x_step == 0 and y_step == 0:
continue
# 计算下一个点的x和y的值
# self.x_values[-1] 代表列表中最后一个值
# 下一个点坐标 使用当前列表中最后一个值与 x轴y轴的移动距离相加
next_x = self.x_values[-1] + x_step
next_y = self.y_values[-1] + y_step
# 最后将下一个点插入到列表末尾,作为最后一个点
self.x_values.append(next_x)
self.y_values.append(next_y)
choice作用是从列表中随机选择一个元素。
from random import choice
# 定义一个列表
my_list = [1, 2, 3, 4, 5]
# 从列表中随机选择一个元素
random_element = choice(my_list)
print(random_element)
然后配合matp使用:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()
s=15代表绘制图中每个数据点的大小。
模拟多次随机漫步
import matplotlib.pyplot as plt
from random_walk import RandomWalk
# 只要程序处于活动状态 就不断的模拟随机漫步
while True:
# 创建一个实例 并将其包含的点都绘制出来
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()
# 关闭matp的查看器的时候 会询问是否再开启另一个 不断的点y就会一直生成
keep_running = input('开启另一个绘图(y/n)')
if keep_running == 'n':
break;
设置一个蓝色渐变的散点图
while True:
# 创建一个实例 并将其包含的点都绘制出来
rw = RandomWalk()
rw.fill_walk()
# 生成数字列表 其中包含的数字个数与漫步包含的点数相同
point_numbers = list( range(rw.num_points) )
plt.scatter(
rw.x_values,
rw.y_values,
c=point_numbers,
cmap=plt.cm.Blues
)
plt.show()
# 关闭matp的查看器的时候 会询问是否再开启另一个 不断的点y就会一直生成
keep_running = input('开启另一个绘图(y/n)')
if keep_running == 'n':
break;
c=point_numbers
c是plt.scatter() 函数的一个参数,用于指定每个散点的颜色。它可以接受多种类型的值:
如果c是一个单一的颜色字符串(如'red'、'blue'等),则所有散点都会使用该颜色。
如果c是一个与 x_values 和 y_values 长度相同的序列(如列表、数组等),则 c 中的每个值将对应一个散点,并根据颜色映射(cmap)来确定该散点的颜色。
在这个例子中,point_numbers 是一个序列,它为每个散点提供了一个用于颜色映射的值。通常,这些值是数值,颜色映射会根据这些数值的大小将不同的颜色分配给相应的散点。
cmap=plt.cm.Blues
cmap也是plt.scatter() 函数的一个参数,用于指定颜色映射(colormap)。颜色映射是一个将数值映射到颜色的函数,它定义了从最小值到最大值的颜色渐变。
plt.cm.Blues 是 matplotlib 库中预定义的一个颜色映射,它表示从浅蓝色到深蓝色的渐变。具体来说,数值较小的点会被映射为浅蓝色,而数值较大的点会被映射为深蓝色。
最终效果就是:这是一个由左至右,浅蓝入深蓝的渐变散点图,值越大颜色会越深。
突出起点和终点
while True:
rw = RandomWalk()
rw.fill_walk()
point_numbers = list( range(rw.num_points) )
plt.scatter(
rw.x_values,
rw.y_values,
c=point_numbers,
cmap=plt.cm.Blues,
edgecolors='none',
s=15
)
#突出起点和重点
# 起点是(0,0)赋予绿色 s是点的大小尺寸
plt.scatter(0, 0, c='green', edgecolors='none', s=100)
# 终点是rw.x_values[-1],rw.y_values[-1] 即数组中最后一个元素 赋予红色
plt.scatter(
rw.x_values[-1],
rw.y_values[-1],
c='red',
edgecolors='none',
s=100
)
plt.show()
keep_running = input('开启另一个绘图(y/n)')
if keep_running == 'n':
break;
隐藏坐标轴
plt.show()
会显示当前的图形并阻塞程序,直到你关闭图形窗口
# 隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
# 隐藏坐标轴
plt.axis('off')
plt.show()
隐藏坐标轴的方法有两种,更推荐使用plt.axis('off‘)
plt.axes()是将坐标轴的可见性设置为false。
特别注意,任何对图形的绘制更改,都要再plt.show之前添加!!
调整窗口尺寸
图表适合屏幕大小适合,更能有效将数据呈现出来。
while True:
# 添加海量的点
rw = RandomWalk(50000)
rw.fill_walk()
# 设置绘图窗口的尺寸
plt.figure( figsize=(10, 6) )
# 生成数字列表 其中包含的数字个数与漫步包含的点数相同
point_numbers = list( range(rw.num_points) )
plt.scatter(
rw.x_values,
rw.y_values,
c=point_numbers,
cmap=plt.cm.Blues,
edgecolors='none',
s=1
)
#突出起点和重点
# 起点是(0,0)赋予绿色
plt.scatter(0, 0, c='green', edgecolors='none', s=100)
# 终点是rw.x_values[-1],rw.y_values[-1] 即数组中最后一个元素 赋予红色
plt.scatter(
rw.x_values[-1],
rw.y_values[-1],
c='red',
edgecolors='none',
s=100
)
# 隐藏坐标轴
plt.axis('off')
plt.show()
keep_running = input('开启另一个绘图(y/n)')
if keep_running == 'n':
break;
figure()用于指定图表的宽度、高度、分辨率和背景色。需要给形参figsize指定一个元组,向matp指出绘图窗口的尺寸,单位为英寸。
PY默认屏幕分辨率是80px/英寸,如果直到自己系统的分辨率,可以使用形参dpi向figure传递该分辨率。如下:
plt.figure( dpi=128, figsize=(10, 6) )