Matplotlib: kontinuierliche Farbkarte füllen zwischen zwei Zeilen

Es ist möglich, zwischen Linien mit einer Farbe zu füllen:

Http://matplotlib.sourceforge.net/examples/pylab_examples/fill_between_demo.html

Es ist auch möglich, eine kontinuierliche Farbkarte für eine Zeile zu verwenden:

Http://matplotlib.sourceforge.net/examples/pylab_examples/multicolored_line.html

Ist es möglich (und relativ leicht), eine kontinuierliche Farbkarte für die farbige Füllung zwischen zwei Zeilen zu verwenden? Beispielsweise kann sich die Farbfüllung entlang x auf der Grundlage der Differenz zwischen den beiden Zeilen bei x (oder basierend auf einem anderen Satz von Daten) ändern.

2 Solutions collect form web for “Matplotlib: kontinuierliche Farbkarte füllen zwischen zwei Zeilen”

Ich habe eine Lösung für dieses Problem gefunden. Es baut auf der brillanten aber hackigen Lösung von @Hooked auf. Sie erstellen ein 2D-Raster aus vielen kleinen Boxen. Es ist nicht die schnellste Lösung, aber es sollte ziemlich flexibel sein (mehr als Lösungen, die für die Patches gelten).

import numpy as np import pylab as plt #Plot a rectangle def rect(ax, x, y, w, h, c,**kwargs): #Varying only in x if len(c.shape) is 1: rect = plt.Rectangle((x, y), w, h, color=c, ec=c,**kwargs) ax.add_patch(rect) #Varying in x and y else: #Split into a number of bins N = c.shape[0] hb = h/float(N); yl = y for i in range(N): yl += hb rect = plt.Rectangle((x, yl), w, hb, color=c[i,:], ec=c[i,:],**kwargs) ax.add_patch(rect) #Fill a contour between two lines def rainbow_fill_between(ax, X, Y1, Y2, colors=None, cmap=plt.get_cmap("Reds"),**kwargs): plt.plot(X,Y1,lw=0) # Plot so the axes scale correctly dx = X[1]-X[0] N = X.size #Pad a float or int to same size as x if (type(Y2) is float or type(Y2) is int): Y2 = np.array([Y2]*N) #No colors -- specify linear if colors is None: colors = [] for n in range(N): colors.append(cmap(n/float(N))) #Varying only in x elif len(colors.shape) is 1: colors = cmap((colors-colors.min()) /(colors.max()-colors.min())) #Varying only in x and y else: cnp = np.array(colors) colors = np.empty([colors.shape[0],colors.shape[1],4]) for i in range(colors.shape[0]): for j in range(colors.shape[1]): colors[i,j,:] = cmap((cnp[i,j]-cnp[:,:].min()) /(cnp[:,:].max()-cnp[:,:].min())) colors = np.array(colors) #Create the patch objects for (color,x,y1,y2) in zip(colors,X,Y1,Y2): rect(ax,x,y2,dx,y1-y2,color,**kwargs) # Some Test data X = np.linspace(0,10,100) Y1 = .25*X**2 - X Y2 = X g = np.exp(-.3*(X-5)**2) #Plot fill and curves changing in x only fig, axs =plt.subplots(1,2) colors = g rainbow_fill_between(axs[0],X,Y1,Y2,colors=colors) axs[0].plot(X,Y1,'k-',lw=4) axs[0].plot(X,Y2,'k-',lw=4) #Plot fill and curves changing in x and y colors = np.outer(g,g) rainbow_fill_between(axs[1],X,Y1,Y2,colors=colors) axs[1].plot(X,Y1,'k-',lw=4) axs[1].plot(X,Y2,'k-',lw=4) plt.show() 

Das Ergebnis ist, Bildbeschreibung hier eingeben

Ihre Lösung ist großartig und flexibel! Besonders der 2D-Fall ist wirklich nett. Ein solches Merkmal könnte hinzugefügt werden, um zwischen ihnen zu fill_between wenn die Farben kwargs der Funktion ein Array mit der gleichen Länge von x und y akzeptieren würden?

Hier ist ein einfacher Fall für den 1D-Fall mit der Funktion fill_between . Es tut dasselbe, aber es benutzt Trapeze anstelle von Rechteck das Ergebnis ist glatter.

 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np from scipy.stats import norm # Select a color map cmap = mpl.cm.bwr # Some Test data npts = 100 x = np.linspace(-4, 4, npts) y = norm.pdf(x) z = np.sin(2 * x) normalize = mpl.colors.Normalize(vmin=z.min(), vmax=z.max()) # The plot fig = plt.figure() ax = fig.add_axes([0.12, 0.12, 0.68, 0.78]) plt.plot(x, y, color="gray") for i in range(npts - 1): plt.fill_between([x[i], x[i+1]], [y[i], y[i+1]], color=cmap(normalize(z[i]))) cbax = fig.add_axes([0.85, 0.12, 0.05, 0.78]) cb = mpl.colorbar.ColorbarBase(cbax, cmap=cmap, norm=normalize, orientation='vertical') cb.set_label("Sin function", rotation=270, labelpad=15) plt.show() 

Bildbeschreibung hier eingeben

  • Pandas Typ Fehler versucht zu plotten
  • Matplotlib: Setzen sowohl Haupt-und Neben-Zecken Kräfte gleichen x und y Skala
  • Matplotlib plot_date hält mal in UTC auch mit benutzerdefinierter Timezone
  • Zwei benachbarte Symbole in Matplotlib Legende
  • Dynamisches Aktualisieren eines Balkenplots in Matplotlib
  • Wie man die kreuzspektrale Dichte benutzt, um die Phasenverschiebung zweier verwandter Signale zu berechnen
  • ArtistAnimation vs FuncAnimation matplotlib Animation matplotlib.animation
  • Ober- / Untergrenzen mit Matplotlib
  • Problem beim Importieren von matplotlib.mlab und .pyplot in python 2.7 auf Mac OSX 10.6
  • Wie ändere ich die Position der 'r' Achse für matplotlib Polarplot?
  • Pyplot: Prozentsatz auf x-Achse verwenden
  • Python ist die beste Programmiersprache der Welt.