title: 使用matplotlib绘制散点图
date: 2019-10-6 10:35:37
author: 无涯明月
toc: true
categories: 机器学习
tags:
- Machine Learning
简单案例
import matplotlib.pyplot as plt
import numpy as np
if __name__ == '__main__':
x = np.linspace(0, 10, 1000) #生成从0~10的1000个均匀数
y = np.sin(x)
plt.figure(figsize=(8, 4), dpi=72) # 大小是8英寸*4英寸,dpi为设置图形每英寸的点数,默认值72
plt.plot(x, y, color='r', label='$sin(x)$') # label='$sin(x)$'设置图例
plt.xlabel('x')
plt.ylabel('y')
plt.title('pyplot_example')
plt.legend() # 图表的图例,默认会自动寻找最佳位置
plt.show()
运行结果:
简单理解一下
plt.figure(figsize=(8, 4), dpi=72)
是设置画图窗口大小,单位是英寸,每英寸72个像素点。plt.plot(x, y, color='r', label='$sin(x)$')
由于我们的画图窗口没有设置拆分,孤儿这里默认在画图窗口上的画图就是铺满整个窗口,故而这里没有指定我们所用的画布是哪个。
第二个案例
这里就是一个画图窗口拆分成我们想要的块数,然后在每个画布块中绘制不同的图像内容。
如:
import matplotlib.pyplot as plt
import numpy as np
if __name__ == '__main__':
x = np.linspace(0, 10, 1000) #生成从0~10的1000个均匀数
y = np.sin(x)
plt.figure(figsize=(8, 4), dpi=72) # 大小是8英寸*4英寸,dpi为设置图形每英寸的点数,默认值72
axis = plt.subplot(1, 3, 1) # 划分窗口 1行3列, 返回第一个画布对象(编号顺序为从左到右、从上到下,从1开始。)
axis.plot(x, y, color='r', label='$sin(x)$')
axis.set_xlabel("x")
axis.set_ylabel('y')
axis.set_title('Sin')
axis.legend() # 图表的图例,默认会自动寻找最佳位置
# 第二个
axis = plt.subplot(132) # 如果这三个参数值都小于10,可以去掉逗号写。
axis.plot(x, np.cos(x), color='r', label='$cos(x)$')
axis.set_xlabel("x")
axis.set_ylabel('y')
axis.set_title('Cos')
axis.legend() # 图表的图例,默认会自动寻找最佳位置
plt.show()
结果:
可以看出设置的方法略微有点差异,不过逻辑类似。这里就说明了。
同时开多个画图窗口
import matplotlib.pyplot as plt
import numpy as np
if __name__ == '__main__':
plt.figure(1) # 创建窗口1
plt.figure(2) # 创建窗口2
ax1 = plt.subplot(1, 2, 1) # 一行两列的画图窗口的第一个画布
ax2 = plt.subplot(1, 2, 2) # 一行两列的画图窗口的第二个画布
x = np.linspace(0, 3, 100) # 生成从0~3的100个均匀数
for i in range(5):
plt.figure(1) # 选取figure(1)
plt.plot(x, np.exp(i * x / 3)) # 做图
plt.sca(ax1) # 选取ax1
plt.plot(x, np.sin(i * x)) # 做图
plt.sca(ax2) # 选取ax2
plt.plot(x, np.cos(i * x)) # 做图
plt.show()
结果:
另一种方式
import matplotlib.pyplot as plt
import numpy as np
if __name__ == '__main__':
fig, axs = plt.subplots(1, 3, figsize=(5, 2)) # 1行3个5x2大小的子图。
x = np.linspace(0, 30, 100)
axs[0].plot(x, np.cos(x))
axs[1].plot(x, np.tan(x))
axs[2].plot(x, np.exp(x))
plt.show()
结果:
绘制散点图
相信通过上面的案例,知道了什么是窗口、画布,知道了如何在窗口中绘制子图等。接着就简单说说如何绘制散点图。
简单案例
先看一个简单的案例:
import matplotlib.pyplot as plt
import numpy as np
if __name__ == '__main__':
# 设置点的个数
N = 20
# 设置窗口大小
plt.figure(figsize=(8, 5), dpi=50)
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y)
plt.show()
结果:
案例可以看出,其实这里的重点就在于如何使用scatter函数:
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None,vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None,hold=None, data=None, * *kwargs):
用CTRL+鼠标左键追踪一下可见
scatter官方文档地址
x
,y
:是构成点集的数组;
s
:是点的大小,可以是一个值,也可以是一个数组,如:plt.scatter(x, y, s=np.linspace(50, 800, N) , c='#F86747')
;
c
:是颜色,默认蓝色,可以使用如’r’,'g’之类的,也可以使用十六进制的,如:c='#F86747'
。和s类似,可以是一个颜色的值,也可以是一个颜色值得序列;
marker
:定义绘制散点图的每个点的形状,默认是实体圆圈,也就是"o",其余的形状如下图:
案例:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
if __name__ == '__main__':
# 设置点的个数
N = 10
# 设置窗口大小
plt.figure(figsize=(8, 5), dpi=50)
x = np.random.randn(N)
y = np.random.randn(N)
# 散点的大小,使用值得序列
size = np.linspace(50, 800, N)
# 颜色,使用颜色值的序列
colors = np.array(['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
plt.scatter(x, y, s=size, c=colors, marker="p")
# 设置字体
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=24)
plt.xlabel("X轴", FontProperties=font)
plt.ylabel("Y轴", FontProperties=font)
plt.title("绘制散点图案例", FontProperties=font)
plt.show()
结果:
最后,值得注意的是:matplotlib
库没有中文字体
在设置label
的时候,我们需要指定使用的是什么字体。可以用系统自带的字体样式。