Scatter-Plot mit einer riesigen Menge an Daten

Ich möchte Matplotlib verwenden , um ein Streudiagramm mit einer riesigen Menge an Daten zu erzeugen (ca. 3 Millionen Punkte). Eigentlich habe ich 3 Vektoren mit der gleichen Dimension und ich benutze, um auf die folgende Weise zu zeichnen.

import matplotlib.pyplot as plt import numpy as np from numpy import * from matplotlib import rc import pylab from pylab import * fig = plt.figure() fig.subplots_adjust(bottom=0.2) ax = fig.add_subplot(111) plt.scatter(delta,vf,c=dS,alpha=0.7,cmap=cm.Paired) 

Nichts Besonderes. Aber es dauert zu lange, um es zu generieren (ich arbeite an meinem MacBook Pro 4 GB RAM mit Python 2.7 und Matplotlib 1.0). Gibt es eine Möglichkeit, die Geschwindigkeit zu verbessern?

  • Interpolieren Sie Werte für 2D Numpy Array
  • Numpy multidimensionale Indexierung und die Funktion 'take'
  • Wie kann man stückweise lineare Passform in Python anwenden?
  • Die Zugriffszeit eines numpy-Arrays wird im Vergleich zum zweiten Letzteren viel mehr durch den letzten Index beeinflusst
  • Die meisten effizienten Eigenschaft zu Hash für numpy Array
  • NumPy mit Cython optimieren
  • Effizient konstruieren FEM / FVM Matrix
  • Wie benutzt man native Cpython-Erweiterungen in Jython
  • 3 Solutions collect form web for “Scatter-Plot mit einer riesigen Menge an Daten”

    Du könntest den hier erwähnten Hitzewellen-Ansatz nehmen. In diesem Beispiel repräsentiert die Farbe die Datenmenge im Bin, nicht den Medianwert des dS-Arrays, aber das sollte sich leicht ändern. Mehr später, wenn Sie interessiert sind.

    Es sei denn, Ihre Grafik ist riesig, viele dieser 3 Millionen Punkte werden sich überschneiden. (Ein 400×600 Bild hat nur 240K Punkte …)

    Also die einfachste Sache zu tun wäre, um eine Probe von sagen, 1000 Punkte, von Ihren Daten zu nehmen:

     import random delta_sample=random.sample(delta,1000) 

    Und nur das plotten.

    Beispielsweise:

     import matplotlib.pyplot as plt import matplotlib.cm as cm import numpy as np import random fig = plt.figure() fig.subplots_adjust(bottom=0.2) ax = fig.add_subplot(111) N=3*10**6 delta=np.random.normal(size=N) vf=np.random.normal(size=N) dS=np.random.normal(size=N) idx=random.sample(range(N),1000) plt.scatter(delta[idx],vf[idx],c=dS[idx],alpha=0.7,cmap=cm.Paired) plt.show() 

    Alt-Text

    Oder, wenn Sie mehr Aufmerksamkeit auf Ausreißer zahlen müssen, dann könnten Sie vielleicht Ihre Daten mit np.histogram , und dann ein delta_sample die Vertreter aus jedem bin.

    Leider bei der Verwendung von np.histogram denke ich nicht, dass es irgendeine einfache Möglichkeit gibt, Bins mit einzelnen Datenpunkten zu verknüpfen. Eine einfache, aber ungefähre Lösung ist, den Ort eines Punktes in oder auf der Binenkante selbst als Proxy für die Punkte in ihm zu verwenden:

     xedges=np.linspace(-10,10,100) yedges=np.linspace(-10,10,100) zedges=np.linspace(-10,10,10) hist,edges=np.histogramdd((delta,vf,dS), (xedges,yedges,zedges)) xidx,yidx,zidx=np.where(hist>0) plt.scatter(xedges[xidx],yedges[yidx],c=zedges[zidx],alpha=0.7,cmap=cm.Paired) plt.show() 

    Alt-Text

    Was ist mit dem Versuchen von pyplot.hexbin ? Es erzeugt eine Art von Wärmemap auf der Grundlage der Punktdichte in einer festgelegten Anzahl von Bins.

    Python ist die beste Programmiersprache der Welt.