当图例只是数值时,如何使用pyplot.scatter()绘制图例?

时间:2017-01-26 15:37:27

标签: python matplotlib plot legend

当我将标签更改为数值时,我无法找到(或弄清楚)如何使用pyplot.scatter()显示图例。

也就是说,我将我的分类值'a','b','c',...转换为0,1,2,......

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter

以下是上面网址中给出的示例:

import numpy as np
import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2  # 0 to 15 point radii

plt.scatter(x, y, s=area, c=colors, alpha=0.5, cmap=cm.jet)
plt.show()

输出enter image description here

通常情况下,我相信有人会这样做:

example = plt.scatter(x, y, s=area, c=colors, alpha=0.5, cmap=cm.jet)
plt.legend(handles=[example])
plt.show()

这不会输出与图中每个颜色对应的图例和数组中的数字。

/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/axes/_axes.py:518: UserWarning: The handle <matplotlib.collections.PathCollection object at 0x1167d03c8> has a label of '_collection0' which cannot be automatically added to the legend.
  'legend.'.format(handle, label))

如何输出显示哪个数字与数组值对应的图例?

2 个答案:

答案 0 :(得分:2)

legend对散点图不起作用,因为散点图会创建单个对象,并且只会在legend中显示为单个项目。由于每个点的颜色取决于轴的颜色图,因此您需要使用colorbar

plt.colorbar(example)

如果您想要legend,则需要为每个组创建单独的散点图,然后从创建的图例。示例here

答案 1 :(得分:1)

这是我个人用于所有matplotlib传说的内容。我通常将数据存储在dictionariespd.Series个对象中。

def get_legend_markers(D_label_color, marker="o", marker_kws={"linestyle":""}):
    """
    Usage: plt.legend(*legend_vars(D_taxon_color),
                      loc="lower center",
                      bbox_to_anchor=(0.5,-0.15),
                      fancybox=True, shadow=True,
                      prop={'size':15})

    Input: Dictionary object of {label:color}
    Output: Tuple of markers and labels
    """
    markers = [plt.Line2D([0,0],[0,0],color=color, marker=marker, **marker_kws) for color in D_label_color.values()]
    return (markers, D_label_color.keys())

所以你可以这样:

D_label_color = {"A":"green", "B":"blue", "C":"red"}
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi)
y = np.sin(x)
c = ["green"]*20 + ["blue"]*20 + ["red"]*10
ax.scatter(x=x, y=y, c=c)
ax.legend(*get_legend_markers(D_label_color)

如果您不确切地知道哪个颜色分配到哪个点,您可以使用seaborn为每个类别分配sns.color_palette(n_colors),然后制作颜色列表/矢量(如{{1然后给出c颜色分配。希望这可以帮助。如果你正在处理连续数据,那么我会使用像上面提到的@suever这样的颜色条。你不可能拥有连续数据的传奇。