2017-04-24 3 views
1

Ich versuche, die Region, die dem Plot gewidmet ist, für ein bestimmtes xtick Label (ohne Marker-Größe) zu bekommen. Zum Beispiel scheint label='b' das Gebiet von (0.5 - 1.5) b/c die Tick-Position ist 1 und ich glaube, die Standard-Tick-Breite ist 1.Wie bekomme ich Position/Index von Xtick in Matplotlib mit Label? (Python 3.6 | Matplotlib 2.0)

Meine Frage, wenn ich ein query_label (z query_label= "c") haben, wie kann ich die tick position von query_label entlang der x-axis und die tick width anzunehmen, jede tick Position getrennt ist durch eine Breite von 1 (z [-1, 0, 1, 2, ...]) bekommen?

Grundsätzlich würde Ich mag mit am Ende:

query_position = (1.5, 2.5) # for query_label = "c"

-Code für das einfache Beispiel:

# Data 
x = np.arange(5) 
y = np.sqrt(x) 
s = [1000]*5 
c = ["aquamarine"]*5 

# Plot 
with plt.style.context("dark_background"): 
    fig, ax = plt.subplots() 
    ax.scatter(x, y, c=c, s=s, edgecolors="ivory", linewidth=2.5) 
    ax.set_xticklabels(list("-abcde"), fontsize=20) 
    ax.grid(False, which="major") 

# Trying to get the xtick info 
ax.get_xticks() 
# array([-1., 0., 1., 2., 3., 4., 5.]) 

# How to get position and tick width? 
query_label= "c" 
def get_position(query_label, ax): 
    # stuff to get tick index 
    # stuff to get tick width 
    tick_padding = tick_width/2 
    return (tick_index - tick_padding, tick_index + tick_padding) 

# Results 
query_position = get_position(query_label, ax) 
query_position 
# (1.5, 2.5) 

Vielleicht gibt es ein Verfahren, bei matplotlib analog zu pd.Index(list("-abcde")).get_loc("c")?

enter image description here

Antwort

1

Ich bin nicht sicher, ob ein Verfahren vorhanden, aber Sie können generieren, aber Sie können ein Wörterbuch mit ax.get_xticklabels() erzeugen, die eine Liste von xticklabel Objekte angezeigt werden können.

Diese Objekte enthalten sowohl die Beschriftung als auch ihre Positionen, die Sie mit Listenverständnis in ein Wörterbuch extrahieren können.

x_label_dict = dict([(x.get_text(), x.get_position()) for x in x_labels]) 

Falls Sie einige der Strichbeschriftungen ausschließen können Sie verwenden ein, wenn die Bedingung als:

x_label_dict = dict([(x.get_text(), x.get_position()[0]) for x in x_labels if x.get_text() not in ['', '-']]) 

Nun ist die Breite jedes Strichbeschriftungen können mit benachbarten Abfrage Etiketten wie bestimmt:

tick_width = x_label_dict['b'] - x_label_dict['a'] 

Daraus ergibt sich die Abfrageposition für 'c' wird

x_label_dict['c'] - tick_width/2, x_label_dict['c'] + tick_width/2 

Nach dem tick_width Bestimmung können Sie das Wörterbuch aktualisieren, damit Sie es direkt, ohne die Notwendigkeit für eine Funktionsdefinition verwenden können

x_query_position = {key: (x_label_dict[key]- tick_width/2, x_label_dict[key] + tick_width/2) for key in x_label_dict.keys()} 

ich die Abfrage Position erraten für 'c' ist x_query_position['c']