matplotlib绘制对应于点的大小和颜色的图例

时间:2017-03-09 22:46:18

标签: python matplotlib plot

我想为类似于scatter_demo.py的散点图创建一个图例。图例应显示最大和最小点的颜色和大小。以下是我到目前为止的情况:

import numpy as np
import matplotlib.pyplot as plt

N = 10
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (10 * np.random.rand(N) + 3)**2

plt.scatter(x, y, s=area, c=colors, edgecolors='face')

b_idx = area.argmax()
s_idx = area.argmin()

plt.scatter(x[b_idx], y[b_idx], s=area[b_idx], c=colors[b_idx],label='big')
plt.scatter(x[s_idx], y[s_idx], s=area[s_idx], c=colors[s_idx], label='small')

plt.legend(title = 'Size and Color')
plt.show()

my_plot

这不会将正确的颜色添加到图例中。我的方法也是双点积分。这会在原点后面产生一个小月牙。

2 个答案:

答案 0 :(得分:1)

问题在于您的数组colors。它需要是一个代表N RGB颜色的3xN阵列。因此,要修复您提供的代码,请使用以下行:

colors = np.random.rand(N,3)

然后,保持其余代码不变,生成以下图表:

enter image description here

答案 1 :(得分:1)

通过将输入值映射到色彩映射,从输入数组colors确定散点的颜色。 (在这种情况下,色彩映射是默认的色彩映射,在散点图调用中隐含设置。) 但是,图例中使用的颜色是来自颜色循环的标准颜色。

正如@DavidG在他的解决方案中指出的,克服这个问题的一种方法是使用rgb颜色数组而不是数组数来指定点的颜色。虽然这解决了为图例条目着色的问题,但它有两个主要缺点:(a)你没有使用色彩图的能力和(b)在现实世界的情况下,显示为颜色的数据本身不是颜色,但是使用颜色可视化的一些标量。

因此,坚持输入colors数组并随后修改代码以在图例中显示颜色的相应最小和最大尺寸点是非常有益的。为此,需要找出它们具有的颜色,并将其提供给用于创建图例的代理艺术家。 这可以使用散点图本身(to_rgba对象)中的ScalarMappable方法完成。

最后,为了不在绘图中绘制两次点,可以简单地为代理散点图提供空坐标数组。

import numpy as np; np.random.seed(20)
import matplotlib.pyplot as plt

N = 10
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (10 * np.random.rand(N) + 3)**2

sc = plt.scatter(x, y, s=area, c=colors, edgecolors='face')

b_idx = area.argmax()
s_idx = area.argmin()

plt.scatter([], [], s=area[b_idx], c=sc.to_rgba(colors[b_idx]),label='big')
plt.scatter([], [], s=area[s_idx], c=sc.to_rgba(colors[s_idx]),label='small')

plt.legend(title = 'Size and Color')
plt.show()

enter image description here