2017-03-13 86 views
1

嘿,我正在使用彩虹文字函數,它可以在here 中找到,以便使y軸標籤的顏色與y軸上的conosle名稱的最接近的顏色相匹配。 所以目前我想出了這個代碼:rainbowtext()函數和y軸標籤

fig, ax= plt.subplots(figsize=(5,6)) #used to take care of the size 
sns.barplot(x=gbyplat,y=gbyplat.index, palette='husl') #creating barplot 
ax.set_ylabel('Publisher', color='deepskyblue', size=15, alpha=0.8) #setting labels 
ax.set_xlabel('Number of titles published', color='slateblue', size=15, alpha=0.7) 
ax.set_title('Titles per platform ranking', color='deeppink', size=17, alpha=0.6) 
ax.set_xlim(0,2350) #setting limit for the plot 
ax.set_xticks(np.arange(0, max(gbyplat), 250)) #ticks frequency 
ax.annotate('newest', size=12, xy=(390, 13), xytext=(700, 13.3), 
      arrowprops=dict(arrowstyle="fancy")) #annotations on plot 
ax.annotate('max', size=9, xy=(2230,0.3), bbox=dict(boxstyle="round", fc="w", alpha=0.5)) 
ax.plot(2161,0, 'o', color='cyan') #creating the cricle highlight for PS2 max 

p = sns.color_palette("husl", len(gbyplat)) 
for i, label in enumerate(ax.get_yticklabels()): 
    label.set_color(p[i]) 
rainbow_text(0,5, "Pub lis her".split(), 
      [p[10],p[11],p[12]], 
      size=10) 

然而,問題是,我必須手動設置座標新生產的「發佈商」標籤。根據函數代碼,我可以傳遞ax參數,自動將標籤貼到y軸上(如果我理解正確的話)。那我該怎麼做?第二個問題是,有沒有辦法訪問ylabel座標(當前y軸標籤'Publisher')? 感謝

the plot

+0

沒有,你誤會了'ax'一樣。它只是選擇添加文本的軸,如果您的軸多於一個,這可能很有用。然而在這裏你只有一個座標軸,所以你可以把它作爲'None'。 – ImportanceOfBeingErnest

回答

0

我們可以設定在了ylabel通常駐留首先繪製ylabel,獲取其座標,然後將其設置爲空字符串的位置的文本。然後可以調整example rainbow text函數以使用獲得的座標。

選擇顏色和座標以使文本具有與其相鄰的條的顏色完全相同的技巧仍然非常棘手。這可能涉及很多嘗試和錯誤。

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import transforms 
import seaborn as sns 

l =list("ABCDEFGHIJK") 
x = np.arange(1,len(l)+1)[::-1] 
f, ax=plt.subplots(figsize=(7,4.5)) 
sns.barplot(x=x,y=l, palette='husl', ax=ax) 

plt.xlabel('Number of titles published', color='slateblue', size=15, alpha=0.7) 

p = sns.color_palette("husl", len(l)) 
for i, label in enumerate(ax.get_yticklabels()): 
    label.set_color(p[i]) 


def rainbow_text(x, y, strings, colors, ax=None, **kw): 
    if ax is None: 
     ax = plt.gca() 
    canvas = ax.figure.canvas 

    lab = ax.set_ylabel("".join(strings)) 
    canvas.draw() 
    labex = lab.get_window_extent() 
    t = ax.transAxes 
    labex_data = t.inverted().transform((labex.x0, labex.y0- labex.height/2.)) 
    ax.set_ylabel("") 

    for s, c in zip(strings, colors): 
     text = ax.text(labex_data[0]+x, labex_data[1]+y, s, color=c, transform=t, 
         rotation=90, va='bottom', ha='center', **kw) 
     text.draw(canvas.get_renderer()) 
     ex = text.get_window_extent() 
     t = transforms.offset_copy(text._transform, y=ex.height, units='dots') 

rainbow_text(0, 0.06, ["Pub", "lish", "er"],[p[6], p[5],p[4]],size=15) 

plt.show() 
+0

好吧,那麼如何獲得ylabel座標? –

+0

您的意思是,如何在示例中獲得'0.06'?那只是通過反覆試驗而已;從'y = 0'開始,然後調整它使得情節看起來不錯。它也將取決於數字大小,因此對於不同的數字大小,可能需要爲y選擇不同的值。 – ImportanceOfBeingErnest

+0

啊所以沒有獲取ylabel座標的方法或函數? –