Pandas / Matplotlib在一列上注释,在另一列上标注

时间:2013-12-02 12:58:03

标签: python matplotlib pandas

我想在散点图中按年份注释我的情节。另外,我还想在pandas数据框中的不同列上标记(添加图例),在本例中为列:ds ['Label']。我已设法用多年来注释分散,但我仍然坚持如何标记来自不同列的数据。

这是我的示例代码

ds

   Label  Year   factor1   factor2   factor3   factor4
0      A  2013  0.318451  0.038893 -0.145478  0.023298
1      B  2013  0.327400 -0.083985 -0.164712 -0.216095
2      C  2013  0.262333  0.251492  0.095186 -0.062729
3      D  2013  0.035074 -0.044357 -0.464473 -0.096461
4      E  2013  0.214464 -0.131810  0.065335 -0.339014
5      F  2013 -0.456510  0.111790  0.358160  0.327663
6      A  2012  0.345147 -0.010345 -0.139058 -0.033598
7      B  2012  0.318605 -0.096974 -0.168039  0.240126
8      C  2012  0.387761  0.145134  0.025229 -0.009165
9      D  2012 -0.007707 -0.033737 -0.401118  0.147932
10     E  2012  0.204582 -0.112144  0.007970  0.367639
11     F  2012 -0.439852  0.128267  0.355429 -0.375302


ds.columnsx=ds['factor2']
y=ds['factor1']
colors = {'A': 'b','B': 'purple', 'C': 'r','D' : 'grey','E' : 'green', 'F' : 'magenta'}
size= 2 *500

x=df['factor2']
y=df['factor1']

labels=df['Year']

fig=figure(1, figsize=(10,8))
ax1 = fig.add_subplot(111)

ax1.scatter(x, y, s=size, alpha=0.7, label=labels, color=[colors[i] for i in           ds['Label']])
for label, x, y in zip(labels, x, y):
plt.annotate(label, xy = (x, y),fontsize = 15)
grid(True)

ax1.spines['bottom'].set_color('orange')
ax1.spines['left'].set_color('green')

ax1.xaxis.label.set_color('orange')
ax1.yaxis.label.set_color('green')
ax1.tick_params(axis='x', colors='k')

plt.title('Something', fontsize = 15)

plt.xlabel('Something')
plt.ylabel('Something')
plt.tight_layout()
plt.show()

example

1 个答案:

答案 0 :(得分:1)

你的问题有点不清楚但我想你想要一个与ds['Label']中的标签相对应的图例。这样做的方法是为每组点数调用ax1.scatter一次,如this question中所示。例如:

colors = {'A': 'b','B': 'purple', 'C': 'r','D' : 'grey','E' : 'green', 'F' : 'magenta'}
size= 1000

fig1, ax1 = plt.subplots(figsize=(10,8))

for t in ('A','B','C'):
    ax1.scatter(ds[ds['Label']==t]['factor2'], ds[ds['Label']==t]['factor1'], 
                color=colors[t], 
                label=t,
                s=size, 
                alpha=0.7)

for label, x, y in zip(ds['Year'], ds['factor2'], ds['factor1']):
    ax1.annotate(label, xy = (x + 0.008, y - 0.003),fontsize = 15)
ax1.legend(markerscale=0.2)

会给你一个带标签的图例。这就是你要找的东西吗?