2017-04-24 197 views
3

我ploting一个明确的数据和值数由sns.countplot()Seaborn对于x countplot设置图例值

我想对x值的传说添加到图如下:手柄设置x值的,标签是x值的描述。

ax = sns.countplot(x = df.GARAGE_DOM) 
handles, labels = ax.get_legend_handles_labels() 

handles = ["VP", "BC", "GC", "GP", "JC", "PO"] 
labels = ["Voie Publique", "box", "Garage couvert", "garage particulier clos", "Jardin clos", "parking ouvert"] 
by_label = OrderedDict(zip(handles,labels)) 
ax.legend(by_label.keys(), by_label.values()) 

但是,我警告

UserWarning:

联想不支持 '副总裁' 的情况。 可以使用代理艺术家代替。 见:http://matplotlib.org/users/legend_guide.html#using-proxy-artist

我读过代理艺术家的文档,但我没有找到我的案例。

enter image description here

感谢您的帮助。

回答

2

这是一个可能的解决方案,创建一个文本字段作为图例处理程序。 以下内容将创建一个TextHandler用于创建图例艺术家,这是一个简单的matplotlib.text.Text实例。图例的手柄以(文本,颜色)元组给出,TextHandler创建所需的Text

import seaborn as sns 
import matplotlib.pyplot as plt 
from matplotlib.legend_handler import HandlerBase 
from matplotlib.text import Text 
import numpy as np 
import pandas as pd 

class TextHandler(HandlerBase): 
    def create_artists(self, legend, tup ,xdescent, ydescent, 
         width, height, fontsize,trans): 
     tx = Text(width/2.,height/2,tup[0], fontsize=fontsize, 
        ha="center", va="center", color=tup[1], fontweight="bold") 
     return [tx] 


a = np.random.choice(["VP", "BC", "GC", "GP", "JC", "PO"], size=100, 
        p=np.arange(1,7)/21.) 
df = pd.DataFrame(a, columns=["GARAGE_DOM"]) 

ax = sns.countplot(x = df.GARAGE_DOM) 


handltext = ["VP", "BC", "GC", "GP", "JC", "PO"] 
labels = ["Voie Publique", "box", "Garage couvert", "garage particulier clos", "Jardin clos", "parking ouvert"] 


t = ax.get_xticklabels() 
labeldic = dict(zip(handltext, labels)) 
labels = [labeldic[h.get_text()] for h in t] 
handles = [(h.get_text(),c.get_fc()) for h,c in zip(t,ax.patches)] 

ax.legend(handles, labels, handler_map={tuple : TextHandler()}) 

plt.show() 

enter image description here


上述溶液是低于原始版本,这似乎更复杂的更新版本。 以下是原始解决方案,它使用 TextAreaAnchoredOffsetbox将文本放置在图例中。

import seaborn.apionly as sns 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
from matplotlib.offsetbox import TextArea, AnchoredOffsetbox 
from matplotlib.transforms import TransformedBbox, Bbox 
from matplotlib.legend_handler import HandlerBase 
import numpy as np 
import pandas as pd 

class TextHandler(HandlerBase): 
    def __init__(self, text, color="k"): 
     self.text = text 
     self.color = color 
     super(TextHandler, self).__init__() 

    def create_artists(self, legend, orig_handle,xdescent, ydescent, 
         width, height, fontsize,trans): 
     bb = Bbox.from_bounds(xdescent,ydescent, width,height) 
     tbb = TransformedBbox(bb, trans) 
     textbox = TextArea(self.text, textprops={"weight":"bold","color":self.color}) 
     ab = AnchoredOffsetbox(loc=10,child=textbox, bbox_to_anchor=tbb, frameon=False) 
     return [ab] 


a = np.random.choice(["VP", "BC", "GC", "GP", "JC", "PO"], size=100, 
        p=np.arange(1,7)/21.) 
df = pd.DataFrame(a, columns=["GARAGE_DOM"]) 

ax = sns.countplot(x = df.GARAGE_DOM) 


handltext = ["VP", "BC", "GC", "GP", "JC", "PO"] 
labels = ["Voie Publique", "box", "Garage couvert", "garage particulier clos", "Jardin clos", "parking ouvert"] 

handles = [ patches.Rectangle((0,0),1,1) for h in handltext] 
t = ax.get_xticklabels() 
labeldic = dict(zip(handltext, labels)) 
labels = [labeldic[h.get_text()] for h in t] 
handlers = [TextHandler(h.get_text(),c.get_fc()) for h,c in zip(t,ax.patches)] 
handlermap = dict(zip(handles, handlers)) 
ax.legend(handles, labels, handler_map=handlermap,) 

plt.show() 
+0

谢谢你的文本字段的技巧,它工作得很好。 – Cheng