在seaborn的条形图

时间:2015-09-11 16:32:43

标签: python matplotlib seaborn

我正在使用seaborn,并试图使我的条形图看起来更好。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

x = ['One', 'Two', 'Three', 'Four', 'Five']
y = [2, 3, 0, 4.5, 4]
y2 = [0, 0, -5, 0, 0]

sns.axes_style('white')
sns.set_style('white')

b = sns.barplot(x,y,color='pink')
sns.barplot(x,y2, color='red')

for p in b.patches:
    b.annotate(
        s='{:.1f}'.format(p.get_height()),
        xy=(p.get_x()+p.get_width()/2.,p.get_height()),
        ha='center',va='center',
        xytext=(0,10),
        textcoords='offset points'
)

b.set_yticks([])
sns.despine(ax=b, left=True, bottom=True)

enter image description here

我实际上从堆栈溢出的另一个线程中获取标记条的代码。

我的问题是正面标有负面的标尺。我还想在每个图的开头摆脱零,并且可能在零中间移动x = ['One','Two','Three','Four','Five'],而不是在底部。

3 个答案:

答案 0 :(得分:3)

这是您需要的逻辑,只需调用barplot并将注释放在x轴的正确一侧

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

x = ['One', 'Two', 'Three', 'Four', 'Five']
y = [2, 3, -5, 4.5, 4]

sns.axes_style('white')
sns.set_style('white')

colors = ['pink' if _y >=0 else 'red' for _y in y]
ax = sns.barplot(x, y, palette=colors)

for n, (label, _y) in enumerate(zip(x, y)):
    ax.annotate(
        s='{:.1f}'.format(abs(_y)),
        xy=(n, _y),
        ha='center',va='center',
        xytext=(0,10),
        textcoords='offset points',
        color=color,
        weight='bold'
    )

    ax.annotate(
        s=label,
        xy=(n, 0),
        ha='center',va='center',
        xytext=(0,10),
        textcoords='offset points',
    )  
# axes formatting
ax.set_yticks([])
ax.set_xticks([])
sns.despine(ax=ax, bottom=True, left=True)

enter image description here

答案 1 :(得分:1)

感谢大家的评论。 这是我的解决方案: 我已将负数移到列表的末尾。 (虽然没有那么大的差别)

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

x = ['One', 'Two', 'Three', 'Four', 'Five']
y = [2, 3, 4, 4.5, 0]
y2 = [0, 0, 0, 0, -5]

figure()
sns.axes_style('white')
b = sns.barplot(x,y2, color='red')

for z in b.patches[4:5]:
    b.annotate(np.round(-z.get_height(),decimals=6),(z.get_x()+z.get_width()/2.,-z.get_height()),ha='center',va='center',xytext=(0,10),textcoords='offset points', color='w')   

b=sns.barplot(x,y, color='blue')
for p in b.patches[5:9]:
    b.annotate(np.round(p.get_height(),decimals=6),(p.get_x()+p.get_width()/2.,p.get_height()),ha='center',va='center',xytext=(0,-10),textcoords='offset points', color='w')

答案 2 :(得分:0)

仅供参考:AK9309的最终答案在我的设置(python 2)中产生以下图: Displayed plot from AK9309 code