鉴于以下情况:
import pandas as pd
import matplotlib.pyplot as plt
d=pd.DataFrame({'category':['a','a','a','b','b','b'],
'year':[1,2,1,2,1,2],
'x':[2,4,5,1,2,3],
'y':[1,2,3,2,4,6],
'clr':['grey','green','grey','blue','grey','orange']})
d
category clr x y year
0 a grey 2 1 1
1 a green 4 2 2
2 a grey 5 3 1
3 b blue 1 2 2
4 b grey 2 4 1
5 b orange 3 6 2
和
for i in np.arange(len(d)):
plt.plot(d.x[i],d.y[i],marker='o',linestyle='none',markerfacecolor=d.clr[i],
markeredgecolor='none',markersize=15)
#clean up axes
plt.tick_params(axis='x',which='both',bottom='off',top='off',color='none',labelcolor='none')
plt.tick_params(axis='y',which='both',left='off',right='off',color='none',labelcolor='none')
lgnd=plt.legend(['Year 1','Year 2'],
numpoints=1,
loc=0,
ncol=1,
fontsize=10,
frameon=False)
lgnd.legendHandles[0]._legmarker.set_markersize(15)
lgnd.legendHandles[1]._legmarker.set_markersize(15)
我想为图例有一个灰点的第1年标记(因为它目前),但对于第2年标记,一个点的每一个不同的颜色(在这种情况下,一个橙子,蓝色,和绿色点都在同一行顺序并不重要,在这个时候,在一排).像这样:
我试过以下方法,但都没用:
lgnd.legendHandles[1]._legmarker.set_numpoints(len(d.clr.unique()))
lgnd.legendHandles[1]._legmarker.set_markeredgecolor(d.clr)
提前感谢!
2条答案
按热度按时间mu0hgdu01#
我很高兴找到了解决你问题的办法(并在此过程中学习一些新技巧)。本质上,您可以创建自己的图例处理程序对象,将所有颜色Map到年份。创建自定义图例处理程序可以通过创建任何具有
legend_artist(self, legend, orig_handle, fontsize, handlebox)
函数的对象来完成。有关此操作的详细信息,请参阅“实现自定义处理程序”this page的部分。我在代码中注解了所有的解释,因为有太多的东西需要用语言来解释,而没有代码来演示。示例代码:
样品输出:
ahy6op9u2#
另一种对我有效的方法是绘制圆(椭圆-参见为什么here)和文本:
结果:x1c 0d1x