web-dev-qa-db-fra.com

Correction de la couleur dans les diagrammes de dispersion dans matplotlib

Je veux fixer la gamme de couleurs sur plusieurs diagrammes de dispersion et ajouter une barre de couleur à chaque tracé (qui sera la même dans chaque figure). Essentiellement, je corrige tous les aspects des axes et de l'espace colorimétrique, etc. afin que les tracés soient directement comparables à l'œil nu.

Pour ma vie, je n'arrive pas à comprendre toutes les différentes façons de fixer la gamme de couleurs. J'ai essayé vmin, vmax, mais cela ne semble rien faire, j'ai aussi essayé clim (x, y) et cela ne semble pas fonctionner non plus.

Cela doit venir ici et là, je ne peux pas être le seul à vouloir comparer différents sous-ensembles de données parmi les tracés ... alors, comment fixez-vous les couleurs pour que chaque donnée conserve sa couleur entre les tracés et ne se remappé à une couleur différente en raison du changement de max/min du sous-ensemble -v- l'ensemble entier?

26
AllenH

La définition de vmin et vmax devrait le faire.

Voici un exemple:

import matplotlib.pyplot as plt

xyc = range(20)

plt.subplot(121)
plt.scatter(xyc[:13], xyc[:13], c=xyc[:13], s=35, vmin=0, vmax=20)
plt.colorbar()
plt.xlim(0, 20)
plt.ylim(0, 20)

plt.subplot(122)
plt.scatter(xyc[8:20], xyc[8:20], c=xyc[8:20], s=35, vmin=0, vmax=20)   
plt.colorbar()
plt.xlim(0, 20)
plt.ylim(0, 20)

plt.show()

Et l'intrigue que cela produit:

alt text

44
tom10

D'accord, ce n'est pas vraiment une réponse, mais un suivi. Les résultats de mon codage modifiant le code de Tom ci-dessus. [Je ne suis pas sûr de vouloir supprimer la coche de réponse, car le code ci-dessus fonctionne et est une réponse à la question!]

Cela ne semble pas fonctionner pour mes données !! Ci-dessous est un code modifié qui peut être utilisé avec mes données pour produire un tracé qui ne fonctionnait pas pour moi pour une raison étrange. L'entrée provient des fonctions h5py (importation du fichier de données hdf5).

Dans ce qui suit, rf85 est un sous-ensemble des tableaux pour le grand lot d'expériences où la puissance RF appliquée au système était d'environ 85 watts vers l'avant. Je suis essentiellement en train de découper et de découper les données différentes façons d'essayer de voir une tendance. Ce sont les 85 watts par rapport à l'ensemble de données complet qui est l'entrée actuelle (il y a plus de données, mais c'est ce que j'ai pour l'instant).

import numpy
import matplotlib.pyplot as plt

CurrentsArray = [array([ 0.83333333,  0.8       ,  0.57142857,  0.83333333,  1.03333333,
        0.25      ,  0.81666667,  0.35714286,  0.26      ,  0.57142857,
        0.83333333,  0.47368421,  0.80645161,  0.47368421,  0.52631579,
        0.36666667,  0.47368421,  0.57142857,  0.47368421,  0.47368421,
        0.47368421,  0.47368421,  0.47368421,  0.61764706,  0.81081081,
        0.41666667,  0.47368421,  0.47368421,  0.45      ,  0.73333333,
        0.8       ,  0.8       ,  0.8       ,  0.47368421,  0.45      ,
        0.47368421,  0.83333333,  0.47368421,  0.22222222,  0.32894737,
        0.57142857,  0.83333333,  0.83333333,  1.        ,  1.        ,
        0.46666667])]

growthTarray = [array([ 705.,  620.,  705.,  725.,  712.,  705.,  680.,  680.,  620.,
        660.,  660.,  740.,  721.,  730.,  720.,  720.,  730.,  705.,
        690.,  705.,  680.,  715.,  705.,  670.,  705.,  705.,  650.,
        725.,  725.,  650.,  650.,  650.,  714.,  740.,  710.,  717.,
        737.,  740.,  660.,  705.,  725.,  650.,  710.,  703.,  700.,  650.])]

CuSearray = [array([ 0.46395015,  0.30287259,  0.43496888,  0.46931773,  0.47685844,
        0.44894925,  0.50727844,  0.45076198,  0.44977095,  0.41455029,
        0.38089693,  0.98174953,  0.48600461,  0.65466528,  0.40563053,
        0.22990327,  0.54372179,  0.43143358,  0.92515847,  0.73701742,
        0.64152173,  0.52708783,  0.51794063,  0.49      ,  0.48878252,
        0.45119732,  0.2190089 ,  0.43470776,  0.43509758,  0.52697697,
        0.21576805,  0.32913721,  0.48828072,  0.62201997,  0.71442359,
        0.55454867,  0.50981136,  0.48212956,  0.46      ,  0.45732419,
        0.43402525,  0.40290777,  0.38594786,  0.36777306,  0.36517926,
        0.29880924])]

PFarray = [array([ 384.,  285.,  280.,  274.,  185.,  185.,  184.,  184.,  184.,
        184.,  184.,  181.,  110.,  100.,  100.,  100.,   85.,   85.,
         84.,   84.,   84.,   84.,   84.,   84.,   84.,   84.,   84.,
         84.,   84.,   84.,   84.,   84.,   27.,   20.,    5.,    5.,
          1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.])]

rf85growthTarray = [array([ 730.,  705.,  690.,  705.,  680.,  715.,  705.,  670.,  705.,
        705.,  650.,  725.,  725.,  650.,  650.,  650.])]

rf85CuSearray = [array([ 0.54372179,  0.43143358,  0.92515847,  0.73701742,  0.64152173,
        0.52708783,  0.51794063,  0.49      ,  0.48878252,  0.45119732,
        0.2190089 ,  0.43470776,  0.43509758,  0.52697697,  0.21576805,
        0.32913721])]

rf85PFarray = [array([ 85.,  85.,  84.,  84.,  84.,  84.,  84.,  84.,  84.,  84.,  84.,
        84.,  84.,  84.,  84.,  84.])]

rf85CurrentsArray = [array([ 0.54372179,  0.43143358,  0.92515847,  0.73701742,  0.64152173,
        0.52708783,  0.51794063,  0.49      ,  0.48878252,  0.45119732,
        0.2190089 ,  0.43470776,  0.43509758,  0.52697697,  0.21576805,
        0.32913721])]

Datavmax = max(max(CurrentsArray))
Datavmin = min(min(CurrentsArray))

plt.subplot(121)
plt.scatter(growthTarray, CuSearray, PFarray, CurrentsArray, vmin=Datavmin, vmax=Datavmax, alpha=0.75)
plt.colorbar()
plt.xlim(600,760)
plt.ylim(0,2.5)

plt.subplot(122)
plt.scatter(rf85growthTarray, rf85CuSearray, rf85PFarray, rf85CurrentsArray, vmin=Datavmin, vmax=Datavmax, alpha=0.75)
plt.colorbar()
plt.xlim(600,760)
plt.ylim(0,2.5)

plt.show()

Et enfin, la sortie:

colorfailed!

Veuillez noter que ce n'est pas le résultat parfait pour mon travail, mais je n'ai pas déployé d'efforts pour le rendre parfait. Ce qui est important cependant: les points de données que vous reconnaîtrez comme identiques entre les tracés ne contiennent pas la même couleur comme cela devrait être le cas en fonction du vmin vmax utiliser ci-dessus (comme le suggère le code de Tom).

C'est insensé. :( J'espère que quelqu'un pourra faire la lumière à ce sujet pour moi! Je suis certain que mon code n'est pas génial, alors ne vous inquiétez pas de toute façon quand il s'agit de mon code !!

Sac supplémentaire de guépards enflammés à tous ceux qui peuvent suggérer une voie à suivre. -Allen

MISE À JOUR - Tom10 a détecté le problème - J'avais par inadvertance utilisé les mauvaises données pour l'un de mes sous-tableaux, provoquant les valeurs pour donner des niveaux de couleur différents de ceux attendus (c'est-à-dire que mes données étaient fausses!) Gros accessoires à Tom pour cela - J'aimerais pouvoir lui donner un autre vote positif, mais en raison de ma méthode de poser cette question, je ne peux pas (désolé Tom!)

Veuillez également voir son merveilleux exemple de tracé de texte aux emplacements de données mentionnés ci-dessous.

Voici une image mise à jour montrant que la méthode de Tom fonctionne effectivement et que le tracé était un problème dans mon propre code: alt text

0
AllenH