2016-03-03 24 views
6

mam wykres histogramu, które mogą być replikowane z poniższej MWE:Oznakowanie bin matplotlib histogramu ze strzałką

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) 

który tworzy fabułę tak:

example histogram

Jak Następnie zajmuję się etykietowaniem pojemnika strzałką dla danej liczby całkowitej?

Na przykład, patrz poniżej, gdzie strzałka etykiety na pojemnik, zawierający całkowitą 300.

example with bin of integer labelled

Edycja: należy dodać idealnie Y współrzędne strzałka powinna być ustawiona przez wysokość pasek to oznaczenie - jeśli to możliwe!

Odpowiedz

4

można użyć annotate dodać strzałkę:

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"), 
      ) 

W tym przykładzie dodałem strzałką, że idzie od współrzędnych (300, 20), (300, 5).

Aby automatycznie skalować strzałkę do wartości w koszu, można użyć matplotlib hist, aby narysować histogram i uzyskać wartości z powrotem, a następnie użyć numpy where, aby znaleźć pojemnik odpowiadający żądanej pozycji.

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" 
+0

Dzięki za odpowiedź, aby dalej rozwijać to pytanie jest to można automatycznie ustawić pozycję y strzałki na podstawie wysokości zasobnika? – BML91

+0

@ BML91 Tak, jest to możliwe ... pozwól mi edytować odpowiedź –

+0

@ BML91 Zobacz moją edycję :-) –

2

@Julien Spronck pokazał najlepszy sposób, jak sądzę. Alternatywnie możesz również użyć arrow; przykładowy kod można znaleźć poniżej. Współrzędna y jest określana automatycznie przez obliczenie, ile elementów znajduje się w określonym pojemniku (z określoną tolerancją, którą możesz sam zdefiniować). Możesz grać z parametrami (długość strzałki, długość strzałki). Oto kod:

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() 

To daje następujące dane wyjściowe (do 200 zamiast 300, jak w przykładzie):

enter image description here