仅具有突出显示值的 matplotlib 条形图

Posted

技术标签:

【中文标题】仅具有突出显示值的 matplotlib 条形图【英文标题】:matplotlib bar chart with highlights values only 【发布时间】:2019-05-12 00:19:28 【问题描述】:

您好,我想要一张这样的条形图。问题是如何通过选择设置相应的xlables?

我编码如下以删除不需要的国家标签,但图表也有 nan 作为标签。

countries=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy']
new_index=list(df.index)
for i in range(len(new_index)):
    if new_index[i] not in countries :
        new_index[i]=np.nan

这是我的结果,标签中有 nan,条形之间的距离更宽:

对于数据:

import numpy as np
import pandas as pd

#Overall Country list
Countries=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy','Czech Republic',
 'Austria',
 'Slovak Republic',
 'Slovenia',
 'Germany',
 'Portugal',
 'Hungary',
 'Colombia',
 'New Zealand',
 'Norway',
 'Latvia']

#Countries to highlight
Desired=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy']

np.random.seed(0)
Value=np.random.rand(len(Countries))
df = pd.DataFrame('Countries': Countries,'Value': Value,)
df.sort_values(['Value'],inplace=True)

df.set_index('Countries',drop=True,inplace=True)
ax_1 = df['Value'].plot(kind='bar', title ="graph", figsize=(10, 6), fontsize=12)
ax_1.set_xlabel("Country Name", fontsize=12)
plt.show()

【问题讨论】:

您能否分享您用于此图的示例数据框?如何尝试绘制此图? @ParvBanks 感谢您的回复。这是一个以国家名称为索引的单列数据框。 你从哪里得到“每 10 年增加的百分点”的值? 好的,您如何将 y 轴上的这些值导入数据框?要使绘图起作用,您需要指定 x 坐标(在这种情况下为国家名称)和 y 坐标(每 10 年的百分比)。 基本上,问题需要包含可重现的代码,以便我们处理此示例。 【参考方案1】:

运行 x-ticks,然后根据 countries 列表禁用其中的一些。

import numpy as np
import pandas as pd

#Overall Country list
Countries=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy','Czech Republic',
 'Austria',
 'Slovak Republic',
 'Slovenia',
 'Germany',
 'Portugal',
 'Hungary',
 'Colombia',
 'New Zealand',
 'Norway',
 'Latvia']

#Countries to highlight
Desired=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy']

np.random.seed(0)
Value=np.random.rand(len(Countries))
df = pd.DataFrame('Countries': Countries,'Value': Value,)
df.sort_values(['Value'],inplace=True)

df.set_index('Countries',drop=True,inplace=True)
ax_1 = df['Value'].plot(kind='bar', title ="graph", figsize=(10, 6), fontsize=12)
ax_1.set_xlabel("Country Name", fontsize=12)



for ticks in ax_1.xaxis.get_major_ticks():
    if ticks.label1.get_text() not in Desired:
        ticks.label1.set_visible(False)
        ax_1.patches[df.index.get_indexer([ticks.label1.get_text()])[0]].set_facecolor('w')
        ax_1.patches[df.index.get_indexer([ticks.label1.get_text()])[0]].set_edgecolor('black')
    else:
        ax_1.patches[df.index.get_indexer([ticks.label1.get_text()])[0]].set_facecolor('r')
        

【讨论】:

它有效,谢谢!但是如何选择这些条并将它们着色为一种颜色?也就是说,被选中的bar全部为红色,其他的保持白色。 您的if 语句应检查not in desired 而不是countries

以上是关于仅具有突出显示值的 matplotlib 条形图的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib,限制图表中的条形数量

Matplotlib sharex 上具有不同 x 值的数据?

Matplotlib条形图仅在非零条形图处显示x-ticks

Matplotlib 条形图不接受数组作为高度参数

使用 Matplotlib 如何在最终图中突出显示一个点

使用 pandas/matplotlib 或 seaborn 排序的条形图