2017-10-11 9 views
1

J'ai écrit un code pour tracer la longitude et la latitude des villes au Royaume-Uni avec la hauteur de la barre 3D représentant la population de ces lieux. J'essaie aussi de coder en couleur les barres en utilisant une carte de couleurs afin que la variation de la population soit plus facilement visible. Cependant, mon doesnt code semblent suivre la palette de couleurs et au lieu de tous les bars ont des couleurs très similaires - Je ne sais pas où je suis allé malProblèmes de couleurs/colorimétrie avec tracé bar3d

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() 

Le code produit cette parcelle:
plot

I pense que la majorité des barres devraient être de couleur rouge/orange, avec seulement les grandes villes étant jaune/vert/bleu ...

Répondre

0

(Z/np.log10(max(pop))).min() est de 0,7. Donc, toutes les valeurs sont en effet dans la gamme supérieure de la palette de couleurs.

Vous voulez probablement normaliser vos données avant de le donner à la palette de couleurs:

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

Merci! Je savais que j'avais besoin de normaliser les données dans un sens, mais je pensais que je l'avais fait avec le code Z/max (Z). Je n'ai pas réalisé qu'il y avait une classe matplotlib pour le faire. Merci encore. –