Другой вариант использования моей библиотеки adjustText
, написанный специально для этой цели (https://github.com/Phlya/adjustText). Я думаю, что это, вероятно, значительно медленнее, чем принятый ответ (он значительно замедляется с большим количеством баров), но гораздо более общий и настраиваемый.
from adjustText import adjust_text
np.random.seed(2017)
x_data = np.random.random_sample(100)
y_data = np.random.random_integers(10,50,(100))
f, ax = plt.subplots(dpi=300)
bars = ax.bar(x_data, y_data, width=0.001, facecolor='k')
texts = []
for x, y in zip(x_data, y_data):
texts.append(plt.text(x, y, y, horizontalalignment='center', color='b'))
adjust_text(texts, add_objects=bars, autoalign='y', expand_objects=(0.1, 1),
only_move={'points':'', 'text':'y', 'objects':'y'}, force_text=0.75, force_objects=0.1,
arrowprops=dict(arrowstyle="simple, head_width=0.25, tail_width=0.05", color='r', lw=0.5, alpha=0.5))
plt.show()
Если мы допускаем autoalignment вдоль оси х, она становится еще лучше (мне просто нужно решить небольшую проблему, он не любит положить метки выше точек и немного не в боковая сторона...).
np.random.seed(2017)
x_data = np.random.random_sample(100)
y_data = np.random.random_integers(10,50,(100))
f, ax = plt.subplots(dpi=300)
bars = ax.bar(x_data, y_data, width=0.001, facecolor='k')
texts = []
for x, y in zip(x_data, y_data):
texts.append(plt.text(x, y, y, horizontalalignment='center', size=7, color='b'))
adjust_text(texts, add_objects=bars, autoalign='xy', expand_objects=(0.1, 1),
only_move={'points':'', 'text':'y', 'objects':'y'}, force_text=0.75, force_objects=0.1,
arrowprops=dict(arrowstyle="simple, head_width=0.25, tail_width=0.05", color='r', lw=0.5, alpha=0.5))
plt.show()
(мне пришлось изменить некоторые параметры здесь, конечно)
довольно приятно. Есть ли способ обобщить это на не-bar grafics? Я пытаюсь аннотировать диаграмму рассеяния, и, естественно, было бы неплохо, если бы расстояние стрел было также минимизировано. Также можно минимизировать количество стрелок, проходящих через цифры? – tarrasch
@tarrasch - Этот принцип должен работать нормально для любого сюжета. Надеюсь, у меня будет время сбить код в более привлекательную форму в ближайшие пару дней (его нужно обобщить, как я уже упоминал). Расстояние между стрелками можно немного уменьшить (измените '2 * L' на' L'), но стрелки вроде бы должны иногда проходить через числа (это начнет становиться намного сложнее, чтобы этого избежать), однако если вы измените настройку «альфа» стрелок на «альфа = 0,3», а текст «цвет» - синий, сюжет начнет выглядеть еще лучше. – fraxel
приятно! я попробую это во второй половине дня :) – tarrasch