gpt4 book ai didi

python - Seaborn countplot 为 x 值设置图例

转载 作者:太空狗 更新时间:2023-10-30 02:55:05 27 4
gpt4 key购买 nike

我正在通过 sns.countplot()

绘制分类数据和值计数

我正在尝试将 x 值的图例添加到图中,如下所示:handles 是 x 值的集合,labels 是 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:

Legend does not support 'VP' instances.A proxy artist may be used instead.See: http://matplotlib.org/users/legend_guide.html#using-proxy-artist

我已经阅读了代理艺术家的文档,但我没有在我的案例中找到示例。

enter image description here

感谢您的帮助。

最佳答案

这是一个可能的解决方案,创建一个文本字段作为图例处理程序。下面将创建一个 TextHandler 用于创建图例艺术家,这是一个简单的 matplotlib.text.Text 实例。图例的句柄以 (text, color) 的元组形式给出,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()

另见 this more generic answer

关于python - Seaborn countplot 为 x 值设置图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43585333/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com