2016-07-12 25 views
2

Ich kann den richtigen Weg nicht finden, um eine cmap (oder Farben) für ein 3D-Balkendiagramm in Matplotlib in meinem iPython-Notizbuch zu setzen. Ich kann mein Diagramm korrekt (28 x 7 Etiketten) in der X- und Y-Ebene mit einigen zufälligen Z-Werten einrichten. Das Diagramm ist schwer zu interpretieren, und ein Grund dafür ist, dass die Standardfarben für die x_data-Beschriftungen [1,2,3,4,5] alle gleich sind. HierDefinieren der Farben von Matplotlib 3D-Balkendiagramm

ist der Code:

%matplotlib inline 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as npfig = plt.figure(figsize=(18,12)) 

ax = fig.add_subplot(111, projection='3d') 

x_data, y_data = np.meshgrid(np.arange(5),np.arange(3)) 
z_data = np.random.rand(3,5).flatten() 

ax.bar3d(x_data.flatten(), 
y_data.flatten(),np.zeros(len(z_data)),1,1,z_data,alpha=0.10) 

Welche der folgenden Tabelle erzeugt:

enter image description here

Ich will nicht die Farben manuell für die Etiketten x_data definieren. Wie kann ich verschiedene 'zufällig' cmap Farben für jede der Etiketten in x_data einzurichten, halten immer noch die

ax.bar3d

Parameter? Nachfolgend finden Sie eine Variation

ax.bar

und verschiedenen Farben, mit, aber was ich brauche, ist ax.bar3d. enter image description here

+0

ich eine Antwort auf [diese Frage] zur Verfügung gestellt (http://stackoverflow.com/questions/43869751/change-bar-color-in-a-3d- Bar-Plot-in-Matplotlib-basiert-auf-Wert), was auch in diesem Zusammenhang interessant sein kann. – ImportanceOfBeingErnest

Antwort

3
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(18,12)) 
ax = fig.add_subplot(111, projection='3d') 

x_data, y_data = np.meshgrid(np.arange(5),np.arange(3)) 
z_data = np.random.rand(3,5) 
colors = ['r','g','b'] # colors for every line of y 

# plot colored 3d bars 
for i in xrange(3): # cycle though y 
    # I multiply one color by len of x (it is 5) to set one color for y line 
    ax.bar3d(x_data[i], y_data[i], z_data[i], 1, 1, z_data[i], alpha=0.1, color=colors[i]*5) 
    # or use random colors 
    # ax.bar3d(x_data[i], y_data[i], z_data[i], 1, 1, z_data[i], alpha=0.1, color=[np.random.rand(3,1),]*5) 
plt.show() 

Ergebnis: enter image description here

+0

Danke, aber das ist keine gute Lösung, da es 'r', 'g', 'b' spezifiziert. Mein realer Datensatz wird irgendwo zwischen 3 und 100 Etiketten haben, die eine eigene Farbe benötigen. Da ich die Größe des Plots nicht kenne, muss die Lösung die automatische Palettenauswahl entsprechend berücksichtigen. –

+1

Sie können zufällige Farben wie oben gezeigt verwenden. – Serenity