2017-01-31 1 views
3

Ich habe einen Pandas-Datenrahmen mit vier Spalten von Messdaten. Ich möchte ein 3D-Oberflächendiagramm mit dem Zeilenindex als X, dem Spaltenindex als Y und den Daten als Z erstellen. (Die Daten in jeder Spalte sind eine Reihe von diskreten Messungen, die von einem Test ausgegeben werden, der alle Werte durchläuft von X für jede Kategorie Y)Matplotlib 3D-Oberflächendiagramm aus 2D Pandas Datenrahmen

import pandas as pd 
import numpy as np 


df = pd.DataFrame(np.random.randn(5, 4), columns=['A', 'B', 'C', 'D']) 
print(df) 

    A   B   C   D 
0 0.791692 -0.945571 0.183304 2.039369 
1 -0.474666 1.117902 -0.483240 0.137620 
2 1.448765 0.228217 0.294523 0.728543 
3 -0.196164 0.898117 -1.770550 1.259608 
4 0.646730 -0.366295 -0.893671 -0.745815 

ich versuchte, das df in eine numpy Raster Umwandlung wie nachstehend unter Verwendung np.meshgrid aber nicht sicher, ob ich wirklich verstehen, was erforderlich ist, oder wenn ich die df Indizes auf diese Weise verwenden kann .

import matplotlib as mpl 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

x = df.columns 
y = df.index 
X,Y = np.meshgrid(x,y) 
Z = df 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(X, Y, Z) 

Ich habe das Matplotlib 3D-Tutorial und verwandte Antworten hier gelesen, bin aber immer noch fest. Wäre sehr dankbar, wenn mir bitte jemand in die richtige Richtung zeigen könnte.

Antwort

2

Die allgemeine Strategie verfolgen Sie ist in Ordnung. Der einzige Fehler, den Sie haben, ist, dass Sie ein Meshgrid aus einer Liste von Strings erstellen. Natürlich kann maplotlib keine Zeichenketten zeichnen.

Sie können daher ein Array mit der gleichen Länge wie die Anzahl der Spalten in Ihrem Datenframe erstellen und dieses an die meshgrid anschließen.

x = np.arange(len(df.columns)) 
+0

Doh! Hatte mich selbst davon überzeugt, dass der Ansatz völlig falsch war und daher das Offensichtliche übersehen. Vielen Dank! – Violet

1

nehmen nur den Spalt Namen ([ 'A', 'B', 'C', 'D']), und es sollte funktionieren.

Sie können später die Ticks der Achse für ['A', 'B', 'C', 'D'] ändern.

import pandas as pd 
import numpy as np 


df = pd.DataFrame(np.random.randn(5, 4)) 

import matplotlib as mpl 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

x = df.columns 
y = df.index 
X,Y = np.meshgrid(x,y) 
Z = df 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(X, Y, Z) 

enter image description here

Verwandte Themen