【问题标题】:matplotlib plotting legend corresponding to size and color of pointsmatplotlib 绘制对应于点大小和颜色的图例
【发布时间】:2017-07-31 02:59:45
【问题描述】:

我想为类似于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()

我的情节

这不会将正确的颜色放入图例中。我的方法也是双重情节。这会在原始点后面创建一个小新月。

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

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

    正如@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()
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这种方法的问题在于,在现实世界中,您永远不想将颜色绘制为颜色,而是将值映射到颜色。所以改变输入数组绝对不是一种选择。
      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      相关资源
      最近更新 更多