散点图是另一种我们经常使用的图表形式。首先我们还是要 import 库,选好图表的样式:
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
1 通过 plt.plot()
绘制散点图
上一章节中,我们使用 plt.plot()
和 ax.plot()
来绘制折线图,其中我们可以自己选择不同的曲线样式,比如实线、虚线、带点的虚线等。我们可以直接将曲线的样式选为“散点”来绘制散点图:
x = np.linspace(0, 10, 30)
y = np.sin(x)
plt.plot(x, y, 'o', color='black');
修改上面 plt.plot()
中的第三个参数,我们可以修改“散点”的符号,所有的样式可以通过查看 plt.plot()
的文档,或者去 Matplotlib 的官方在线文档查看。下面我们看几个最常用的例子:
rng = np.random.RandomState(0)
for marker in ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']:
plt.plot(rng.rand(5), rng.rand(5), marker, label=f"marker='{marker}'")
plt.legend(numpoints=1)
plt.xlim(0, 1.8)
更加简便的方法我们在上一章节也演示过了,就是把 plt.plot()
后面的两个参数合并:
plt.plot(x, y, '-ok')
plt.plot()
中其他的参数也可以用来控制曲线和 marker 的样式:
plt.plot(x, y, '-p', color='gray',
markersize=15, linewidth=4,
markerfacecolor='white',
markeredgecolor='gray',
markeredgewidth=2)
plt.ylim(-1.2, 1.2)
关于 plt.plot()
其他的好玩的参数,还是看 plt.plot()
的官方文档吧!
2 使用 plt.scatter()
绘制散点图
plt.scatter()
是绘制散点图更强大的函数(毕竟看名字就是专门干这行的)。
plt.scatter(x, y, marker='o')
plt.scatter()
和 plt.plot()
在绘制散点图方面,主要的区别在于 plt.scatter()
可以单独控制每一个点的属性(大小、内部颜色、轮廓颜色等)。
下面我们随机生成一些点,并给它们赋予不同的颜色和尺寸。同时为了体现出它们相互重叠的层次关系,我们使用 alpha
( 透明度 ) 关键词来改变点的透明度:
rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.3, cmap='viridis')
plt.colorbar() # show color scale
值得注意的是, c
( color ) 参数被自动映射成了 color scale ( 使用 colorbar()
展示出来的 ); s
( size ) 参数的单位是像素。这种图像多用于展示多维数据。
比如,我们使用 Scikit-Learn 中的鸢尾花数据集:
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data.T
plt.scatter(features[0], features[1], alpha=0.2,
s=100*features[3], c=iris.target, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
仔细分析上图,我们可以从中得到鸢尾花数据四个不同维度的信息:
- x 轴代表花萼的长度
- y 轴代表花萼的宽度
- 散点的大小代表花瓣的宽度(
s=100*features[3]
) - 散点的颜色代表鸢尾花的种类(
c=iris.target
)
总之,不同颜色以及具有不同特征的散点图可以帮我们更好的发掘数据中的信息。
3 plot()
与 scatter()
的对比 —- 性能差异
在大数据量的散点图绘制上,plt.plot()
的性能明显好于 plt.scatter()
。因为 plt.scatter()
需要为每一个点从创建一个对象(因为不同点的颜色、大小等可能不同),而 plt.plot()
只创建一个点的实例,其他的点都是这个点的拷贝。
所以还是根据不同的应用场景选择合适的函数吧。每个点都一样,就用 plt.plot()
;为了展示数据不同维度的信息,每个点长得不一样,还是使用 plt.scatter()
吧;如果非常在乎性能,当然还是 plt.plot()
.