2017-03-09 556 views
1

我想创建一个类似于scatter_demo.py的散点图的图例图例应显示最大和最小点的颜色和大小。以下是我迄今为止:matplotlib绘制图例对应于点的大小和颜色

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

这不把正确的颜色变成传说。我的方法也是双重点。这会在原点后面形成一个小月牙。

回答

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

1

问题在于你的数组colors。它需要是代表N个RGB颜色的3xN阵列。因此,要解决你已经提供的代码,使用下面的行:

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

然后,保持该代码的其余部分保持不变以下图形产生:

enter image description here

+0

这种方法的问题是,在现实世界中,你永远要绘制颜色的颜色,但值映射到颜色。所以改变输入数组是绝对没有选择的。 – ImportanceOfBeingErnest

相关问题