gpt4 book ai didi

python-2.7 - Seaborn 水平条形图

转载 作者:行者123 更新时间:2023-12-04 17:52:12 28 4
gpt4 key购买 nike

默认的 Seaborn 条形图几乎对我有用,尽管有一些细节。如下图所示:

Seaborn Horizontal Bar Plot

请查看每个栏旁边和右侧的“文本”注释。有几件事我想改进:

  1. 由于某种原因,最后一个栏没有显示注释。我不知道如何解决这个问题。

  2. 条形图的边缘与顶部和底部 X 轴之间没有空间。我想在那里放一些空间。

  3. 是否可以增加条形的宽度?

  4. 我还想增加“最高”条与右侧 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()

它是这样的: enter image description here

然后我将向 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')

enter image description here这就是我得到的:

所以注释文本因为偏移而被隐藏了。利用这些知识,我可以调整我的原始脚本以在最后一个栏中显示带注释的文本。但这会导致额外的问题。在事先不知道柱数的情况下,如何调整代码使其保持一致?

您的答案 2 没有问题。谢谢。

因为我使用的是 sns.barplot,所以数字 3 对我不起作用。 Python 不喜欢调用 barplot 时的宽度参数。

4 号工作正常。谢谢。

感谢您对我的问题的帮助。

最佳答案

  1. 关于第一点,我们需要一个minimal, complete, verifiable example .

  2. 为了在边缘条和轴之间放置空间,可以调整轴的限制。 ax.set_ylim(-1,N),其中 N 是条数。

  3. 可以使用 plt.barwidth 参数设置条的宽度。plt.bar(..., width=1);或者,对于水平条,使用 height 参数。 Seaborn 条形图不允许设置宽度或高度。

  4. 与 2 相同,只是使用 ax.set_xlim(0,barmax*1.4),其中 barmax 是柱的最大长度。

关于python-2.7 - Seaborn 水平条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741536/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com