2016-07-30 7 views
4

Ich möchte eine Anmerkung machen, etwas wie here, aber ich muss einen Bereich in x anstelle eines einzelnen Punktes zeigen. Es ist so etwas wie die dimension lines in technischer Zeichnung. HierWie notieren Sie einen Bereich der x-Achse in Matplotlib?


ist ein Beispiel dafür, was ich suche:

import matplotlib.pyplot as plt 
import numpy as np 

xx = np.linspace(0,10) 
yy = np.sin(xx) 

fig, ax = plt.subplots(1,1, figsize=(12,5)) 
ax.plot(xx,yy) 
ax.set_ylim([-2,2]) 
# ----------------------------------------- 
# The following block attempts to show what I am looking for 
ax.plot([4,6],[1,1],'-k') 
ax.plot([4,4],[0.9,1.1],'-k') 
ax.plot([6,6],[0.9,1.1],'-k') 
ax.annotate('important\npart', xy=(4, 1.5), xytext=(4.5, 1.2)) 

enter image description here


Wie mit Anmerkungen versehen ich einen Bereich in einem maplotlib Graph?


Ich verwende:

Python: 3.4.3 + numpy: 1.11.0 + matplotlib: 1.5.1

Antwort

2

Sie können zwei Anrufe ax.annotate verwenden - man den Text hinzufügen und einen einen Pfeil mit flachen Enden die den Bereich ziehen Sie annotieren wollen:

import matplotlib.pyplot as plt 
import numpy as np 

xx = np.linspace(0,10) 
yy = np.sin(xx) 

fig, ax = plt.subplots(1,1, figsize=(12,5)) 
ax.plot(xx,yy) 
ax.set_ylim([-2,2]) 

ax.annotate('', xy=(4, 1), xytext=(6, 1), xycoords='data', textcoords='data', 
      arrowprops={'arrowstyle': '|-|'}) 
ax.annotate('important\npart', xy=(5, 1.5), ha='center', va='center') 

enter image description here

1

Mit ali_m's answer, ich könnte diese Funktion definieren, vielleicht kann es irgendwann für jemanden nützlich sein :)


Funktion

def annotation_line(ax, xmin, xmax, y, text, ytext=0, linecolor='black', linewidth=1, fontsize=12): 

    ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', 
      arrowprops={'arrowstyle': '|-|', 'color':linecolor, 'linewidth':linewidth}) 
    ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', 
      arrowprops={'arrowstyle': '<->', 'color':linecolor, 'linewidth':linewidth}) 

    xcenter = xmin + (xmax-xmin)/2 
    if ytext==0: 
     ytext = y + (ax.get_ylim()[1] - ax.get_ylim()[0])/20 

    ax.annotate(text, xy=(xcenter,ytext), ha='center', va='center', fontsize=fontsize) 

Anruf

annotation_line(ax=ax, text='Important\npart', xmin=4, xmax=6, \ 
        y=1, ytext=1.4, linewidth=2, linecolor='red', fontsize=18) 

Ausgabe

enter image description here