Показать конечное значение по оси y каждой строки с помощью matplotlib

#python #matplotlib

#python #matplotlib

Вопрос:

Я рисую график с несколькими строками, используя matplotlib, и я хочу отобразить конечное y значение рядом с тем местом, где заканчивается каждая строка с правой стороны, вот так: введите описание изображения здесь

Какие-либо решения или указатели на соответствующие части API? Я в полном замешательстве.

Я использую matplotlib 1.0.0 и интерфейс pyplot, например pyplot.plot(xs, ys, f, xs_, ys_, f_) .

Комментарии:

1. Спасибо за редактирование для встраивания изображения!

Ответ №1:

Хотя в ответе Офри нет ничего плохого, annotate предназначен специально для этой цели:

 import matplotlib.pyplot as plt
import numpy as np

x = np.arange(61).astype(np.float)
y1 = np.exp(0.1 * x)
y2 = np.exp(0.09 * x)

plt.plot(x, y1)
plt.plot(x, y2)

for var in (y1, y2):
    plt.annotate('%0.2f' % var.max(), xy=(1, var.max()), xytext=(8, 0), 
                 xycoords=('axes fraction', 'data'), textcoords='offset points')

plt.show()
  

введите описание изображения здесь

Это помещает текст на 8 пунктов правее правой стороны оси с максимальным значением y для каждого графика. Вы также можете добавить стрелки и т.д. Смотрите http://matplotlib.sourceforge.net/users/annotations_guide.html (Вы также можете изменить выравнивание по вертикали, если хотите, чтобы текст был центрирован по вертикали на заданном значении y. Просто укажите va='center' .)

Кроме того, это не зависит от расположения тиков, поэтому оно будет идеально работать для графиков журнала и т.д. Указание местоположения текста в терминах положений границ оси и его смещения в точках имеет много преимуществ, если вы начнете изменять масштаб графика и т.д.

Комментарии:

1. При работе с этим конкретным примером это решение предполагает, что значения увеличиваются, а конечное значение равно максимальному значению. Если вы действительно хотите получить конечное значение, используйте: ` plt.annotate(‘%0.2f’% var[-1], xy =(1, var.max()), xytext=(8, 0), xycoords=(‘дробь по осям’, ‘данные’), textcoords =’точки смещения’) `

Ответ №2:

Вариант 1pyplot.text

 pyplot.text(x, y, string, fontdict=None, withdash=False, **kwargs)
  

Вариант 2 — Использовать вторую ось:

 second_axes = pyplot.twinx() # create the second axes, sharing x-axis
second_axis.set_yticks([0.2,0.4]) # list of your y values
pyplot.show() # update the figure
  

Комментарии:

1. Первый вариант выполняет свою работу (в основном, см. Мой комментарий выше), но мне действительно нравится второй! Приходится вручную настраивать тот же форматировщик оси, но это не проблема. Спасибо!

2. Однако это вызывает некоторые трудности, когда ось y имеет логарифмический масштаб. Числа отображаются так, как если бы новой оси не было. Если для второй оси y также задан логарифмический масштаб, то числа не отображаются.

Ответ №3:

Очень полезный Джо. Только еще одна деталь. Если конечное значение не является максимальным, вы можете использовать y[-1]. Я добавил горизонтальную линию для уточнения.

 gbm = np.log(np.cumsum(np.random.randn(10000)) 10000)
plt.plot(gbm)
plt.annotate('%0.2f' % gbm[-1], xy=(1, gbm[-1]), xytext=(8, 0), 
             xycoords=('axes fraction', 'data'), textcoords='offset points')
plt.axhline(y=gbm[-1], color='y', linestyle='-.')
plt.show()
  

Постройте график с отмеченным конечным значением по оси y.

Комментарии:

1. Как присвоить значение по группам во фрейме данных?