2017-10-11 10 views
1

Ich habe einen Code geschrieben, um den Längen- und Breitengrad von Städten in Großbritannien zu zeichnen, wobei die Höhe der 3D-Balken die Einwohnerzahl dieser Orte repräsentiert. Ich versuche auch, die Balken farblich zu codieren, indem ich eine Farbabbildung benutze, so dass die Variation der Population leichter zu sehen ist. Allerdings scheinen mein Code doesnt die colormap und stattdessen alle Bars haben sehr ähnliche Farben zu folgen - Ich bin nicht sicher, wo ich falsch habenColormap/Farbprobleme mit bar3d plot

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

pop = [189120, 91297, 107123, 107355, 94782, 87590, 142968, 1085810, 117963, 147663, 194189, 187503, 349561, 229700, 535907, 145818, 335145, 110507, 116447, 86011, 88483, 119441, 325949, 106943, 92363, 255394, 109805, 144170, 109185, 468720, 113507, 120046, 104157, 589900, 136362, 88243, 88134, 88855, 91053, 94932, 120256, 162949, 284321, 144957, 474632, 443760, 100160, 552267, 8173941, 211228, 107627, 510746, 174700, 171750, 268064, 128060, 215173, 186682, 289301, 86552, 96555, 159994, 161707, 234982, 154718, 238137, 97886, 95580, 218705, 107926, 109691, 134022, 103886, 518090, 155298, 123187, 253651, 175547, 91703, 102885, 89663, 105878, 270726, 174286, 109015, 179485, 182441, 142723, 99251, 165456, 131982, 91930, 218791, 83641, 103608, 105367, 265178, 100153, 109120, 152841] 

lat = [57.14369, 53.55, 51.56844, 51.26249, 51.37795, 52.13459, 53.39337, 52.48142, 53.75, 53.81667, 53.58333, 50.72048, 53.79391, 50.82838, 51.45523, 52.2, 51.48, 51.73575, 51.9, 53.1905, 53.25, 51.88921, 52.40656, 51.11303, 54.52429, 52.92277, 53.52327, 56.5, 50.76871, 55.95206, 50.7236, 54.96209, 51.38914, 55.86515, 51.86568, 53.56539, 53.71667, 54.68611, 50.85519, 51.75369, 51.62907, 53.64904, 53.7446, 52.05917, 53.79648, 52.6386, 53.22683, 53.41058, 51.50853, 51.87967, 51.26667, 53.48095, 54.57623, 52.04172, 54.97328, 51.58774, 52.25, 52.62783, 52.9536, 52.52323, 53.54051, 51.75222, 52.57364, 50.37153, 50.71667, 50.79899, 53.76667, 51.58571, 51.45625, 53.61766, 53.43012, 53.42519, 53.48771, 53.38297, 51.50949, 52.41426, 50.90395, 51.53782, 53.64779, 53.45, 51.90224, 53.40979, 53.00415, 54.90465, 52.56667, 51.62079, 51.55797, 52.67659, 53.68331, 53.39254, 51.65531, 52.51868, 51.50853, 51.34603, 53.53333, 51.31903, 52.58547, 52.18935, 50.81448, 53.95763] 

long = [-2.09814, -1.48333, 0.45782, -1.08708, -2.35907, -0.46632, -3.01479, -1.89983, -2.48333, -3.05, -2.43333, -1.8795, -1.75206, -0.13947, -2.59665, 0.11667, -3.18, 0.46958, -2.08333, -2.89189, -1.41667, 0.90421, -1.51217, -0.18312, -1.55039, -1.47663, -1.13691, -2.96667, 0.28453, -3.19648, -3.52751, -1.60168, 0.54863, -4.25763, -2.2431, -0.07553, -1.85, -1.2125, 0.57292, -0.47517, -0.74934, -1.78416, -0.33525, 1.15545, -1.54785, -1.13169, -0.53792, -2.97794, -0.12574, -0.41748, 0.51667, -2.23743, -1.23483, -0.75583, -1.61396, -2.99835, -0.88333, 1.29834, -1.15047, -1.46523, -2.1183, -1.25596, -0.24777, -4.14305, -2.0, -1.09125, -2.71667, 0.60459, -0.97113, -2.1552, -1.35678, -2.32443, -2.29042, -1.4659, -0.59541, -1.78094, -1.40428, 0.71433, -3.00648, -2.73333, -0.20256, -2.15761, -2.18538, -1.38222, -1.81667, -3.94323, -1.78116, -2.44926, -1.49768, -2.58024, -0.39602, -1.9945, -0.12574, -2.97665, -2.61667, -0.55893, -2.12296, -2.22001, -0.37126, -1.08271] 


fig = plt.figure() 
ax = Axes3D(fig) 

X,Y,Z = np.array(long),np.array(lat),np.log10(np.array(pop)) 

colours = plt.cm.rainbow_r(Z/np.log10(max(pop))) 

plot1 = ax.bar3d(X,Y,Z,dx=0.2,dy=0.2,dz=Z/3,color=colours) 
ax.set_xlabel('\nLongitude (\u00B0)') 
ax.set_ylabel('\nLatitude (\u00B0)') 
ax.set_zlabel('\nlog\u2081\u2080(Population)') 
ax.set_zlim3d(4,7) 
ax.view_init(elev=70,azim=280) 


colourMap = plt.cm.ScalarMappable(cmap=plt.cm.rainbow_r) 
colourMap.set_array(Z) 
colBar = plt.colorbar(colourMap).set_label('log\u2081\u2080(Population)') 

plt.show() 

Der Code dieses Grundstück produziert:
plot

I denke, dass die Mehrheit der Bars rot/orange in der Farbe sein sollte, mit nur den Hauptstädten, die gelb/grün/blau sind ...

Antwort

0

(Z/np.log10(max(pop))).min() ist 0.7. Alle Werte liegen also im oberen Bereich der Colormap.

Sie wollen wahrscheinlich um Ihre Daten zu normalisieren, bevor es den colormap geben:

norm = plt.Normalize((Z/np.log10(max(pop))).min(), (Z/np.log10(max(pop))).max()) 
colours = plt.cm.rainbow_r(norm(Z/np.log10(max(pop)))) 

enter image description here

+0

Thank you! Ich wusste, dass ich die Daten in gewisser Weise normalisieren musste, dachte aber, ich hätte das mit dem Z/max (Z) -Code gemacht. Ich wusste nicht, dass es eine Matplotlib-Klasse dafür gab. Danke noch einmal. –