当我将标签更改为数值时,我无法找到(或弄清楚)如何使用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()
通常情况下,我相信有人会这样做:
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))
如何输出显示哪个数字与数组值对应的图例?
答案 0 :(得分:2)
legend
对散点图不起作用,因为散点图会创建单个对象,并且只会在legend
中显示为单个项目。由于每个点的颜色取决于轴的颜色图,因此您需要使用colorbar
plt.colorbar(example)
如果您想要legend
,则需要为每个组创建单独的散点图,然后从创建的图例。示例here
答案 1 :(得分:1)
这是我个人用于所有matplotlib传说的内容。我通常将数据存储在dictionaries
和pd.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这样的颜色条。你不可能拥有连续数据的传奇。