Matplotlib 饼图标签与值不匹配

arm*_*amy 5 python matplotlib bar-chart pandas pie-chart

我正在研究这个https://www.kaggle.com/edqian/twitter-climate-change-sentiment-dataset

\n

我已经将情绪从数字转换为其字符描述(即 0 将是中性,1 将是赞成,-1 将是反)

\n
import pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\ntweets_df = pd.read_csv(\'twitter_sentiment_data.csv\')\n\ntweets_df.loc[tweets_df[\'sentiment\'] == 0, \'twt_sentiment\'] = \'Neutral\'\ntweets_df.loc[tweets_df[\'sentiment\'] == -1, \'twt_sentiment\'] = \'Anti\'\ntweets_df.loc[tweets_df[\'sentiment\'] == 1, \'twt_sentiment\'] = \'Pro\'\n\ntweets_df = tweets_df.drop([\'sentiment\'], axis=1) \n\n# display(tweets_df.head())\n                                                                                                                                              message             tweetid twt_sentiment\n0           @tiniebeany climate change is an interesting hustle as it was global warming but the planet stopped warming for 15 yes while the suv boom  792927353886371840          Anti\n1  RT @NatGeoChannel: Watch #BeforeTheFlood right here, as @LeoDiCaprio travels the world to tackle climate change https://toco/LkDehj3tNn htt\xc3\x83\xc2\xa2\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\x82\xc2\xa6  793124211518832641           Pro\n2                               Fabulous! Leonardo #DiCaprio\'s film on #climate change is brilliant!!! Do watch. https://toco/7rV6BrmxjW via @youtube  793124402388832256           Pro\n3     RT @Mick_Fanning: Just watched this amazing documentary by leonardodicaprio on climate change. We all think this\xc3\x83\xc2\xa2\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\x82\xc2\xa6 https://toco/kNSTE8K8im  793124635873275904           Pro\n4         RT @cnalive: Pranita Biswasi, a Lutheran from Odisha, gives testimony on effects of climate change & natural disasters on the po\xc3\x83\xc2\xa2\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\x82\xc2\xa6  793125156185137153           NaN\n
Run Code Online (Sandbox Code Playgroud)\n

我想创建一个带有子图的图表,以价值和百分比的形式显示情绪。我尝试过的代码:

\n
sns.set(font_scale=1.5)\nstyle.use("seaborn-poster")\n\nfig, axes = plt.subplots(1, 2, figsize=(20, 10), dpi=100)\n\nsns.countplot(tweets_df["twt_sentiment"], ax=axes[0])\nlabels = list(tweets_df["twt_sentiment"].unique())\n\naxes[1].pie(tweets_df["twt_sentiment"].value_counts(),\n            autopct="%1.0f%%",\n            labels=labels,\n            startangle=90,\n            explode=tuple([0.1] * len(labels)))\n\nfig.suptitle("Distribution of Tweets", fontsize=20)\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

结果不是我想要的,因为饼图标签是错误的。

\n

饼图标签错误

\n

在 value_counts 中使用 sort=False 后,饼图如下所示:

\n

排序后=False

\n

Tre*_*ney 3

  • labels = list(tweets_df["twt_sentiment"].unique())不将标签按照与 的索引相同的顺序放置tweets_df.twt_sentiment.value_counts()。索引决定切片顺序。因此,最好使用.value_counts()索引作为标签。
  • 可以轻松地将标签添加到条形图中,然后就不需要饼图了。
import pandas as pd
import matplotlib.pyplot as plt

tweets_df = pd.read_csv('data/kaggle/twitter_climate_change_sentiment/twitter_sentiment_data.csv')

tweets_df.loc[tweets_df['sentiment'] == -1, 'twt_sentiment'] = 'Anti'
tweets_df.loc[tweets_df['sentiment'] == 1, 'twt_sentiment'] = 'Pro'
tweets_df.loc[tweets_df['sentiment'] == 0, 'twt_sentiment'] = 'Neutral'

# assign value_counts to a variable; this is a pandas.Series
vc = tweets_df.twt_sentiment.value_counts()

# assign the value_counts index as the labels
labels = vc.index

# custom colors
colors = ['tab:blue', 'tab:orange', 'tab:green']

fig, axes = plt.subplots(1, 2, figsize=(10, 5), dpi=100)

# plot the pandas.Series directly with pandas.Series.plot
p1 = vc.plot(kind='bar', ax=axes[0], color=colors, rot=0, xlabel='Tweet Sentiment', width=.75)

# add count label
axes[0].bar_label(p1.containers[0], label_type='center')

# add percent labels
blabels = [f'{(v / vc.sum())*100:0.0f}%' for v in vc]
axes[0].bar_label(p1.containers[0], labels=blabels, label_type='edge')

# make space at the top of the bar plot
axes[0].margins(y=0.1)

# add the pie plot
axes[1].pie(vc, labels=labels, autopct="%1.0f%%", startangle=90, explode=tuple([0.1] * len(labels)), colors=colors)

fig.suptitle("Distribution of Tweets", fontsize=20)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述