如何从特定组的条形图中删除空 space,该组在 pandas 数据框中的数据上绘制为 seaborn 条形图

how to remove empty space from bars for a specific group, that was plotted as seaborn bar plot on data in pandas dataframe

我有一个如下所示的数据集:

import pandas as pd, seaborn as sns, matplotlib.pyplot as plt, numpy as np

data = {"country":  ["USA", "USA",  "USA",  "GBR",  "GBR",  "GBR",  "IND",  "IND",  "IND"],
"sector":   ["Others", "Sec1", "Sec2",  "Others",   "Sec2", "Sec1", "Others",   "Sec1", "Sec3"],
"counts":   [8763,  8121,   7822,   580,    481,    460,    332,    193,    154]}

df = pd.DataFrame.from_dict(data)

df['counts_log'] = df['counts'].apply(lambda x: np.log10(x))

当我使用以下代码绘制此数据时:

plt.figure(figsize=(18, 6))
sns.barplot(x='country', y='counts_log', hue='sector', data=df, palette='tab10')
plt.legend([],[], frameon=False)
plt.show()

我遇到以下问题(在 IND 的横条之间总是有一些 space):

无论我尝试过什么,它都不会消失。如何解决这个问题?

发生这种情况是因为您的 DataFrame 中缺少值。

你可以清楚地看到他们旋转 df

pivot = df.pivot(index=['country'], columns=['sector'], values='counts_log')
print(pivot)

这给

sector     Others      Sec1      Sec2      Sec3
country                                        
GBR      2.763428  2.662758  2.682145       NaN
IND      2.521138  2.285557       NaN  2.187521
USA      3.942653  3.909610  3.893318       NaN

所以,INDSec2中有“space”,因为你没有数据。 GBR Sec3USA Sec3.

相同

我可以建议的唯一解决方法是在子图中绘制

color_map = {
    'Others': 'C0',
    'Sec1': 'C1',
    'Sec2': 'C2',
    'Sec3': 'C3',
}
df['color'] = df.sector.map(color_map)

fig, ax = plt.subplots(1, 3, figsize=(15, 5), sharey=True)
for i, country in enumerate(df.country.unique()):
    _df = df[df.country==country].sort_values(by='sector')
    sns.barplot(
        ax=ax[i],
        data=_df,
        x='sector', y='counts_log',
        palette=_df.color
    )
    ax[i].set(
        title=country
    )

也许这不是您要搜索的内容,但希望对您有所帮助。