Маркировка гистограммного блока matplotlib со стрелкой

У меня есть график гистограммы, который можно воспроизвести с помощью MWE ниже:

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import numpy as np pd.Series(np.random.normal(0, 100, 1000)).plot(kind='hist', bins=50) 

Что создает такой сюжет:

пример гистограммы

Как же мне потом пометить ящик стрелкой для заданного целого?

Например, см. Ниже, где стрелка указывает ячейку, содержащую целое число 300.

пример с бином с целым числом, помеченным

EDIT: я должен добавить, что координаты y стрелки должны быть установлены автоматически по высоте бара, который он маркирует, если это возможно!

2 Solutions collect form web for “Маркировка гистограммного блока matplotlib со стрелкой”

вы можете использовать annotate для добавления стрелки:

 import pandas as pd import matplotlib.pyplot as plt #import seaborn as sns import numpy as np fig, ax = plt.subplots() series = pd.Series(np.random.normal(0, 100, 1000)) series.plot(kind='hist', bins=50, ax=ax) ax.annotate("", xy=(300, 5), xycoords='data', xytext=(300, 20), textcoords='data', arrowprops=dict(arrowstyle="->", connectionstyle="arc3"), ) 

В этом примере я добавил стрелку, которая идет от координат (300, 20) до (300, 5).

Чтобы автоматически масштабировать стрелку до значения в бункере, вы можете использовать matplotlib hist для построения гистограммы и получения значений обратно, а затем использовать numpy, where найти, какой бит соответствует желаемой позиции.

 import pandas as pd import matplotlib.pyplot as plt #import seaborn as sns import numpy as np nbins = 50 labeled_bin = 200 fig, ax = plt.subplots() series = pd.Series(np.random.normal(0, 100, 1000)) ## plot the histogram and return the bin position and values ybins, xbins, _ = ax.hist(series, bins=nbins) ## find out in which bin belongs the position where you want the label ind_bin = np.where(xbins >= labeled_bin)[0] if len(ind_bin) > 0 and ind_bin[0] > 0: ## get position and value of the bin x_bin = xbins[ind_bin[0]-1]/2. + xbins[ind_bin[0]]/2. y_bin = ybins[ind_bin[0]-1] ## add the arrow ax.annotate("", xy=(x_bin, y_bin + 5), xycoords='data', xytext=(x_bin, y_bin + 20), textcoords='data', arrowprops=dict(arrowstyle="->", connectionstyle="arc3"), ) else: print "Labeled bin is outside range" 

Я думаю, что @Julien Spronck показал лучший способ. Кроме того, вы также можете использовать arrow ; код примера можно найти ниже. Y-ccordinate определяется автоматически, вычисляя количество элементов в определенном бункере (с определенным допуском, который вы можете определить сами). Вы можете играть с параметрами (длина стрелки, длина стрелки). Вот код:

 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import numpy as np mySer = pd.Series(np.random.normal(0, 100, 1000)) mySer.plot(kind='hist', bins=50) # that is where you want to add the arrow ind = 200 # determine how many elements you have in the bin (with a certain tolerance) n = len(mySer[(mySer > ind*0.95) & (mySer < ind*1.05)]) # define length of the arrow lenArrow = 10 lenHead = 2 wiArrow = 5 plt.arrow(ind, n+lenArrow+lenHead, 0, -lenArrow, head_width=wiArrow+3, head_length=lenHead, width=wiArrow, fc='k', ec='k') plt.show() 

Это дает вам следующий результат (для 200 вместо 300, как в вашем примере):

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

  • Построение горизонтальной линии на нескольких подзаголовках в питоне с использованием pyplot
  • Интерактивный график в Python?
  • Как переключать оси в matplotlib?
  • Может ли Numpy's frompyfunc () вернуть изображение?
  • Латексная цитата в matplotlib Легенда
  • Использовать текст Юникода с морским
  • Как отобразить значение бара на каждом баре с pyplot.barh ()?
  • Могу ли я поместить чейнджер цвета в петлю?
  • Показывать не ascii (японский) персонажей в легенде сюжета панд
  • plt.show () зависает на OSX с помощью Anaconda Python
  • Как создать тройной контурный сюжет в Python?
  • Python - лучший язык программирования в мире.