默认的 Seaborn 条形图几乎对我有用,尽管有一些细节。如下图所示:
请查看每个栏旁边和右侧的“文本”注释。有几点我想改进:
由于某种原因,最后一栏不显示注释。我不知道如何解决这个问题。
条形边缘与顶部和底部 X 轴之间没有空间。我想在那里留一些空间。
无论如何,是否可以增加条形的宽度?
我还想增加“最高”条和右 Y 轴之间的距离,因为我计划添加文本,而不仅仅是与其 X 轴值相对应的厚度数字。如果您查看与 HRA 的 Red0 类别相对应的条形图,则该值类似于 105.65 (42.54%)。这显然会将其推“超过”右 Y 轴的边缘。有没有办法让它的峰值和最大 X 轴值之间有更多的距离?例如,如果我可以将其设置为条形的最大高度(易于计算)加上一定的数量。
如果我能照顾好这些细节,那就更完美了!
这是与上述问题相关的我的代码片段:
sns.set_style('whitegrid')
sns.set(font_scale=0.8)
thickness = []
for hra_color in df_hra_colors['hra']:
thickness.append(grouped.get_group(hra_color).count()['hra'] * mult)
df_hra_colors['thickness'] = thickness
ax = sns.barplot(x='thickness', y='hra', data=df_hra_colors,
palette=df_hra_colors['hex'].tolist())
ax.set_xlabel("Thickness")
ax.set_ylabel("HRA")
ax.set_title("What an Awesome Plot!")
for p in ax.patches:
ax.annotate("%.2f" % p.get_width(), (p.get_x() + p.get_width(), p.get_y() + 1.2),
xytext=(5, 10), textcoords='offset points')
plt.show()
这是根据要求提供的一个最小的、完整的可验证示例:
""" Minimal program for demonstration """
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
def main():
sns.set_style('whitegrid')
sns.set(font_scale=0.8)
# plt.rcParams['figure.figsize'] = (10,10)
df_hra_colors = pd.DataFrame({
'hra': ['red', 'green', 'blue'],
'hex': ['#cc0000', '#40ff00', '#0000ff']
})
thickness = [1, 2, 3]
thick_sum = sum(thickness)
df_hra_colors['thickness'] = thickness
ax = sns.barplot(x='thickness', y='hra', data=df_hra_colors,
palette=df_hra_colors['hex'].tolist())
plt.xlim(0, max(thickness) + 30)
ax.set_xlabel("Thickness")
ax.set_ylabel("HRA")
ax.set_title("What an Awesome Plot!")
for i, p in enumerate(ax.patches):
ax.annotate("%.2f (%.2f)%%" % (p.get_width(), thickness[i] / thick_sum * 100.0),
(p.get_x() + p.get_width(), p.get_y() + 1),
xytext=(5, 10), textcoords='offset points')
plt.show()
if __name__ == "__main__":
main()
And this is how it looks:
然后,我将 p.get_y() 添加 1 的行更改为添加 0.5,如下所示:
for i, p in enumerate(ax.patches):
ax.annotate("%.2f (%.2f)%%" % (p.get_width(), thickness[i] / thick_sum * 100.0),
(p.get_x() + p.get_width(), p.get_y() + 0.5),
xytext=(5, 10), textcoords='offset points')
And this is what I got:
因此,注释文本由于偏移而被隐藏。利用这些知识,我可以调整原始脚本以在最后一栏中显示带注释的文本。但这会带来额外的问题。当您事先不知道柱数时,如何调整代码以保持一致?
你的答案2效果很好。谢谢。
由于我使用的是 sns.barplot,所以第 3 号对我不起作用。 Python 不喜欢调用 barplot 时使用宽度参数。
4号效果很好。谢谢。
感谢您对我的问题的帮助。