Аннотировать панды Барный график со ссылкой на другой столбец [дубликат]

Вам нужно нормализовать строки версии, чтобы их можно было сравнить. Что-то вроде

  import java.util.regex.Pattern;  public class Main {public static void main (String ... args) {compare ("1.0", "1.1");  сравнить («1.0.1», «1.1»);  сравнить («1.9», «1.10»);  сравнить («1.a», «1.9»);  } private static void compare (String v1, String v2) {String s1 = normalisedVersion (v1);  Строка s2 = нормализованная версия (v2);  int cmp = s1.compareTo (s2);  Строка cmpStr = cmp & lt;  0?  "& Л;"  : cmp & gt;  0?  "& GT;"  : "==";  System.out.printf ("'% s'% s '% s'% n", v1, cmpStr, v2);  } public static String normalizedVersion (String version) {return normalisedVersion (версия, ".", 4);  } public static String normalizedVersion (String version, String sep, int maxWidth) {String [] split = Pattern.compile (sep, Pattern.LITERAL) .split (версия);  StringBuilder sb = new StringBuilder ();  for (String s: split) {sb.append (String.format ("%" + maxWidth + 's', s));  } return sb.toString ();  }}  

Печатает

  '1.0' & lt;  '1.1' '1.0.1' & lt;  '1,1' '1,9'  '1.10' '1.a' & gt;  '1.9'  
35
задан DataSwede 22 August 2014 в 16:31
поделиться

2 ответа

Вы получаете его прямо из патчей осей:

In [35]: for p in ax.patches:
    ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))

Вы хотите настроить форматирование строк и смещения, чтобы получить объекты по центру, возможно, используйте ширину от p.get_width(), но это должно заставить вас начать. Может не работать со штабелями, если вы не отслеживаете смещения где-нибудь.

55
ответ дан TomAugspurger 16 August 2018 в 10:57
поделиться
  • 1
    Спасибо @TomAugsPurger, работало следующее: for p in ax.patches: ax.annotate(np.round(p.get_height(),decimals=2), (p.get_x()+p.get_width()/2., p.get_height()), ha='center', va='center', xytext=(0, 10), textcoords='offset points') – leroygr 22 August 2014 в 15:34
  • 2
    Другой вопрос: как бы вы обрабатывали бары с отрицательными значениями? С помощью приведенного выше кода метки всегда имеют положительные координаты, даже если значение столбца отрицательное. – leroygr 22 August 2014 в 16:05
  • 3
    Есть ли аналогичное решение для горизонтальных баров: kind = barh? – Nickpick 5 October 2015 в 15:42
  • 4
    Я нашел, что это работает для barh: ax.annotate(str(p.get_width()), (p.get_x() + p.get_width(), p.get_y()), xytext=(5, 10), textcoords='offset points') – ksindi 4 January 2016 в 21:00
  • 5
    Спасибо @capitalistpug. Я обнаружил, что добавление горизонтального выравнивания сделало вас лучше. ax.annotate(str(int(p.get_width())), (p.get_x() + p.get_width(), p.get_y()), xytext=(-2, 4), textcoords='offset points', horizontalalignment='right') +1 – DaveL17 14 December 2016 в 23:02

Решение, которое обрабатывает также отрицательные значения с формированием плавающего образца.

Все еще нуждается в настройках смещения.

df=pd.DataFrame({'A':np.random.rand(2)-1,'B':np.random.rand(2)},index=['val1','val2'] )
ax = df.plot(kind='bar', color=['r','b']) 
x_offset = -0.03
y_offset = 0.02
for p in ax.patches:
    b = p.get_bbox()
    val = "{:+.2f}".format(b.y1 + b.y0)        
    ax.annotate(val, ((b.x0 + b.x1)/2 + x_offset, b.y1 + y_offset))

16
ответ дан tworec 16 August 2018 в 10:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: