2017-04-21 3 views
0

Ich habe ein spärliches Streudiagramm, um den Vergleich zwischen vorhergesagten und tatsächlichen Werten zu visualisieren. Der Wertebereich ist 1-4 und es gibt keine Dezimalstellen.Hinzufügen von Punkten als Label in einem spärlichen Streudiagramm

Ich habe plotly versucht, so weit mit hte folgenden Code (aber ich kann auch eine matplotlib Lösung verwenden):

my_scatter = go.Scatter(
    x = y_actual, y = y_pred, mode = 'markers', 
    marker = dict(color = 'rgb(240, 189, 89)', opacity=0.5) 
) 

Dies druckt die Grafik schön (siehe unten). Ich verwende Opazität, um die Dichte an jedem Punkt zu sehen. I.e. Wenn zwei Punkte übereinander liegen, wird der Punkt in dunklerer Farbe angezeigt. Dies ist jedoch nicht erklärend genug. Ist es möglich, die Zählungen an jedem Punkt als Label hinzuzufügen? An bestimmten Schnittpunkten gibt es Überschneidungen. Ich möchte anzeigen, wie viele Punkte sich schneiden. Kann dies automatisch mit matplotlib oder plotly getan werden?

enter image description here

+0

@ImportanceOfBeingErnest Ich bin für diese Entschuldigung. Ich hoffe, es sieht besser aus! (könnte wegen meinem schlechten Englisch sein!) – renakre

+1

In Matplotlib gibt es keinen automatischen Weg, um zu tun, was Sie wollen. (Ich weiß aber nichts über Plot). Möglicherweise müssen Sie herausfinden, welche Punkte sich überlappen, möglicherweise mithilfe eines numpy histogram2d oder einer Panda-Pivot-Tabelle. Dann könnten Sie die Punkte mit Anmerkungen versehen (z. B. mit matplotlib.text). – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Haben Sie eine Empfehlung, die Daten mit einem anderen Diagramm darzustellen? – renakre

Antwort

1

Diese Antwort verwendet matplotlib.

Um die erste Frage zuerst zu beantworten: Sie müssen herausfinden, wie oft die Daten einen Punkt an einer gegebenen Koordinate erzeugen, um die Punkte mit Anmerkungen versehen zu können. Wenn alle Werte ganze Zahlen sind, kann dies leicht mit einem 2D-Histogramm durchgeführt werden. Aus dem hstogram würde man dann wählen Sie nur die Bins, wo der Zählwert nicht Null ist und die entsprechenden Werte in einer Schleife mit Anmerkungen versehen:

x = [3, 0, 1, 2, 2, 0, 1, 3, 3, 3, 4, 1, 4, 3, 0] 
y = [1, 0, 4, 3, 2, 1, 4, 0, 3, 0, 4, 2, 3, 3, 1] 

import matplotlib.pyplot as plt 
import numpy as np 

x = np.array(x) 
y = np.array(y) 

hist, xbins,ybins = np.histogram2d(y,x, bins=range(6)) 
X,Y = np.meshgrid(xbins[:-1], ybins[:-1]) 
X = X[hist != 0]; Y = Y[hist != 0] 
Z = hist[hist != 0] 


fig, ax = plt.subplots() 
ax.scatter(x,y, s=49, alpha=0.4) 

for i in range(len(Z)): 
    ax.annotate(str(int(Z[i])), xy=(X[i],Y[i]), xytext=(4,0), 
       textcoords="offset points") 

plt.show() 

enter image description here

Sie können dann entscheiden, nicht alle Punkte zu zeichnen, aber das Ergebnis von der Histogrammierung, die die Möglichkeit bietet, die Farbe und die Größe der Streupunkte zu ändern,

ax.scatter(X,Y, s=(Z*20)**1.4, c = Z/Z.max(), cmap="winter_r", alpha=0.4) 

enter image description here

Da alle Werte ganze Zahlen sind, können Sie auch für ein Bild Grundstück entscheiden kann,

fig, ax = plt.subplots() 
ax.imshow(hist, cmap="PuRd") 

for i in range(len(Z)): 
    ax.annotate(str(int(Z[i])), xy=(X[i],Y[i]), xytext=(0,0), color="w", 
       ha="center", va="center", textcoords="offset points") 

enter image description here

Ohne die necesity die Anzahl der Vorkommen zu berechnen, ist eine weitere Option, um ein hexbin Grundstück zu verwenden. Dies ergibt etwas ungenaue Positionen der Punkte, du zu dem hexagonalen Binning, aber ich wollte diese Option noch erwähnen.

import matplotlib.pyplot as plt 
import matplotlib.colors 
import numpy as np 

x = np.array(x) 
y = np.array(y) 

fig, ax = plt.subplots() 

cmap = plt.cm.PuRd 
cmaplist = [cmap(i) for i in range(cmap.N)] 
cmaplist[0] = (1.0,1.0,1.0,1.0) 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list('mcm',cmaplist, cmap.N) 

ax.hexbin(x,y, gridsize=20, cmap=cmap, linewidth=0) 

plt.show() 

enter image description here

+0

danke für die ausführliche Antwort !!! – renakre

Verwandte Themen