matplotlib 散点图:如何使用 data= 参数

matplotlib scatter plot: How to use the data= argument

scatter() 的 matplotlib 文档指出:

In addition to the above described arguments, this function can take a data keyword argument. If such a data argument is given, the following arguments are replaced by data[]:

All arguments with the following names: ‘s’, ‘color’, ‘y’, ‘c’, ‘linewidths’, ‘facecolor’, ‘facecolors’, ‘x’, ‘edgecolors’.

但是,我不知道如何让它工作。 最小的例子

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=(3, 2))
props = {'c': ['r', 'g', 'b'],
         's': [50, 100, 20],
         'edgecolor': ['b', 'g', 'r']}

plt.scatter(data[:, 0], data[:, 1], data=props)
plt.show()

生成具有默认颜色和大小的图,而不是提供的图。

有人用过这个功能吗?

参考您的示例,我认为以下内容符合您的要求:

plt.scatter(data[:, 0], data[:, 1], **props)

文档中的那一点让我感到困惑,并且查看来源,axes/_axes.py 中的 scatter 似乎对这个 data 参数没有任何作用。剩下的 kwargs 最终作为 PathCollection 的参数,可能那里有一个错误。

您也可以在 scatter 之后使用 PathCollection 中的各种 set 方法设置这些参数,例如:

pc = plt.scatter(data[:, 0], data[:, 1])
pc.set_sizes([500,100,200])

这似乎是大约两年前添加的一个被忽视的功能。发行说明有一个简短的例子( https://matplotlib.org/users/prev_whats_new/whats_new_1.5.html#working-with-labeled-data-like-pandas-dataframes). Besides this question and a short blog post (https://tomaugspurger.github.io/modern-6-visualization.html) 这就是我所能找到的。

基本上,任何类似 dict 的对象("labeled data" 作为文档调用它)在 data 参数中传递,并根据其键指定绘图参数。例如,您可以创建一个包含字段 abc

的结构化数组
coords = np.random.randn(250, 3).view(dtype=[('a', float), ('b', float), ('c', float)])

您通常会使用

创建 ab 的图
pyplot.plot(coords['a'], coords['b'], 'x')

但使用数据参数可以用

完成
pyplot.plot('a', 'b','x', data=coords)

标签 b 可能会与将线条设置为蓝色的样式字符串混淆,但第三个参数消除了这种歧义。它也不限于 x 和 y 数据,

pyplot.scatter(x='a', y='b', c='c', data=coords)

将根据第 'c' 列设置点颜色。

看起来这个功能是为 pandas 数据帧添加的,并且比其他对象更好地处理它们。此外,它似乎没有很好的文档记录并且有些不稳定(使用 xy 关键字参数在 plot 命令中失败,但在 scatter 中工作正常,错误消息是没有帮助)。话虽如此,当您要绘制的数据带有标签时,它会提供很好的 shorthand。