【问题标题】:Manually set color of points in legend手动设置图例中点的颜色
【发布时间】:2014-07-05 02:49:03
【问题描述】:

我正在制作一个如下所示的散点图:

(问题底部的 MWE)

如上图所示,matplotlib 自动将图例中点的颜色设置为蓝色。我需要将此点设置为颜色图中不存在的其他颜色(即:黑色),这样它们就不会与与所述颜色图关联的颜色产生混淆。

我环顾四周,但 matplotlib.legend 模块似乎不接受 color 关键字。有没有办法做到这一点?


这是 MWE:

import matplotlib.pyplot as plt
import numpy as np

def rand_data():
    return np.random.uniform(low=0., high=1., size=(100,))

# Generate data.
x, y, x2, x3 = [rand_data() for i in range(4)]
# This data defines the markes and labels used.
x1 = np.random.random_integers(7, 9, size=(100,))

# Order all lists so smaller points are on top.
order = np.argsort(-np.array(x2))
# Order x and y.
x_o, y_o = np.take(x, order), np.take(y, order)
# Order list related to markers and labels.
z1 = np.take(x1, order)
# Order list related to sizes.
z2 = np.take(x2, order)
# Order list related to colors.
z3 = np.take(x3, order)

plt.figure()
cm = plt.cm.get_cmap('RdYlBu')

# Scatter plot where each value in z1 has a different marker and label
# assigned.
mrk = {7: ('o', '7'), 8: ('s', '8'), 9: ('D', '9')}
for key, value in mrk.items():

    s1 = (z1 == key)
    plt.scatter(x_o[s1], y_o[s1], marker=value[0], label=value[1],
        s=z2[s1] * 100., c=z3[s1], cmap=cm, lw=0.2)

# Plot colorbar
plt.colorbar()

# Plot legend.
plt.legend(loc="lower left", markerscale=0.7, scatterpoints=1, fontsize=10)

plt.show()

【问题讨论】:

    标签: python numpy matplotlib colors legend


    【解决方案1】:

    您可以获取图例句柄并单独更改它们的颜色:

    ax = plt.gca()
    leg = ax.get_legend()
    leg.legendHandles[0].set_color('red')
    leg.legendHandles[1].set_color('yellow')
    

    【讨论】:

      【解决方案2】:

      如果您想将颜色映射到特定标签,您可以使用lh.get_label() 检索每个图例句柄的标签。

      出于我的目的,最好从legendHandles 创建一个字典并更改颜色,如下所示:

      ax = plt.gca()
      leg = ax.get_legend()
      hl_dict = {handle.get_label(): handle for handle in leg.legendHandles}
      hl_dict['9'].set_color('red')
      hl_dict['8'].set_color('yellow')
      

      【讨论】:

        【解决方案3】:

        添加到其他答案 - 我在过去使用 set_color 更改图例标记的颜色时遇到了麻烦。另一种方法是自己构建图例:

        import matplotlib.lines as mlines
        
        eight = mlines.Line2D([], [], color='blue', marker='s', ls='', label='8')
        nine = mlines.Line2D([], [], color='blue', marker='D', ls='', label='9')
        # etc etc
        plt.legend(handles=[eight, nine])
        

        从头开始构建图例有时可以省去处理已构建图例的晦涩内部结构的麻烦。更多信息见 Matplotlib 文档here

        【讨论】:

          【解决方案4】:

          虽然我发现legendHandles[i].set_color 的解决方案不适用于errorbar,但我设法采取了以下解决方法:

          ax_legend = fig.add_subplot(g[3, 0])
          ax_legend.axis('off')
          handles_markers = []
          markers_labels = []
          for marker_name, marker_style in markers_style.items():
              pts = plt.scatter([0], [0], marker=marker_style, c='black', label=marker_name)
              handles_markers.append(pts)
              markers_labels.append(marker_name)
              pts.remove()
          ax_legend.legend(handles_markers, markers_labels, loc='center', ncol=len(markers_labels), handlelength=1.5, handletextpad=.1)
          

          也请参阅this GitHub issue

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-12-04
            • 2015-08-02
            • 2015-10-03
            • 2016-02-08
            • 1970-01-01
            • 2013-06-15
            相关资源
            最近更新 更多