Маркировка гистограммного блока 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, как в вашем примере):

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

  • Matplotlib: добавьте ось двойного y без использования его значений на графиках
  • Несколько imshow-subplots, каждый с цветной панелью
  • Как отключить второстепенные тики логарифма в Matplotlib?
  • оси для участка рассеяния не удерживаются в matplotlib
  • matplotlib, используя doublex и twiny вместе (например, twinxy)
  • Построение кривой с эквидистантными (дуговыми) маркерами
  • Использовать imshow matplotlib.pylab с идеей python?
  • анимационный фильм matplotlib: качество фильма со временем уменьшается
  • Python - лучший язык программирования в мире.