pandas 在histplot中将具有较低值的条设置为前景

ycggw6v2  于 2023-05-15  发布在  其他
关注(0)|答案(1)|浏览(121)

当使用seaborn创建直方图时,我希望动态地将计数较低的条形图放在前面。下面是一个最小的例子,现在蓝条总是在前面,无论它的计数。例如,在第二个垃圾箱中,我希望橙子条在前面。基本上,我正在寻找类似于multiple="stack"的东西,但是没有添加列。这可能吗?

import numpy as np
import pandas as pd
import seaborn as sns
sns.set()
df_A = pd.DataFrame(np.random.randint(0, 10, 100), columns=["value"])
df_A["label"] = "A"
df_B = pd.DataFrame(np.random.randint(0, 10, 100), columns=["value"])
df_B["label"] = "B"
df = pd.concat([df_A, df_B])
sns.histplot(df, x="value", bins=np.arange(0, 10, 1), hue="label")

k97glaaz

k97glaaz1#

您可以遍历生成的条形容器并比较相应条形的高度。然后,可以使用高度的顺序来设置它们的z顺序。或者,您可以设置alpha=1使它们不透明。

import numpy as np
import pandas as pd
import seaborn as sns

sns.set()
df_A = pd.DataFrame(np.random.randint(0, 10, 100), columns=["value"])
df_A["label"] = "A"
df_B = pd.DataFrame(np.random.randint(0, 10, 100), columns=["value"])
df_B["label"] = "B"
df = pd.concat([df_A, df_B])
ax = sns.histplot(df, x="value", bins=np.arange(0, 10, 1), hue="label")

for bar0, bar1 in zip(ax.containers[0], ax.containers[1]):
    order = np.argsort([bar0.get_height(), bar1.get_height()])
    bar0.set_zorder(4 - order[0])
    bar1.set_zorder(4 - order[1])

下面是一个具有更多色调值的示例。np.argsort需要被调用两次才能得到相反的顺序。

import numpy as np
import pandas as pd
import seaborn as sns

sns.set()
df = pd.DataFrame({"value": np.random.normal(0.01, 1, 4000).cumsum(),
                   "label": np.repeat([*"ABCD"], 1000)})
ax = sns.histplot(df, x="value", bins=30, hue="label", kde=True,
                  line_kws={'zorder': 10, 'lw': 3, 'ls': ':'})
num_groups = len(df["label"].unique())

for bars in zip(*ax.containers):
    order = np.argsort(np.argsort([b.get_height() for b in bars]))
    for bar, bar_order in zip(bars, order):
        bar.set_zorder(2 + num_groups - bar_order)

相关问题