Comment faire de Matplotlib les nuages de points transparents en tant que groupe?
Je suis en train de faire quelques nuages de points à l'aide de Matplotlib (python 3.4.0, matplotlib 1.4.3, fonctionnant sur Linux Mint 17). Il est assez facile de définir la transparence alpha pour chaque point individuellement; est-il possible de les définir en tant que groupe, de sorte que les deux se chevauchent points du même groupe ne changez pas la couleur?
Exemple de code:
import matplotlib.pyplot as plt
import numpy as np
def points(n=100):
x = np.random.uniform(size=n)
y = np.random.uniform(size=n)
return x, y
x1, y1 = points()
x2, y2 = points()
fig = plt.figure(figsize=(4,4))
ax = fig.add_subplot(111, title="Test scatter")
ax.scatter(x1, y1, s=100, color="blue", alpha=0.5)
ax.scatter(x2, y2, s=100, color="red", alpha=0.5)
fig.savefig("test_scatter.png")
Résultats de cette sortie:
mais je veux quelque chose de plus comme celui-ci:
Je peux contourner ce problème en économie que le SVG et manuellement regroupement puis dans Inkscape, puis réglage de la transparence, mais je préfère vraiment quelque chose que je peux code. Des suggestions?
OriginalL'auteur Jason | 2015-05-07
Vous devez vous connecter pour publier un commentaire.
Oui, c'est une question intéressante. Vous pouvez obtenir ce nuage de points avec Galbées. Voici le code :
et le résultat est :
descartes
paquet permettrait de simplifier le tracé?Merci ! Oui, le
descartes
package peut être utilisé. Après lacascaded_union
: créer des patchs avecdescartes.PolygonPatch
, utilisezmatplotlib.collections.PathCollection
et remplaceradd_patch
paradd_collection
. Ce sera de faire le travail avec moins de lignes.OriginalL'auteur Flabetvibes
Question intéressante, je pense que toute utilisation d'une volonté de transparence résultat de la superposition de l'effet que vous voulez éviter. Vous pourriez définir manuellement un type de transparence la couleur afin d'obtenir plus près les résultats que vous voulez,
Le chevauchement entre les différentes couleurs ne sont pas inclus dans ce chemin, mais vous obtenez,
Vous ne pouvez pas voir le rouge par le bleu ou vice versa.
Je pense que la couleur est mauvais, il devrait être un RGBA tuple, au lieu de RVB donc: [0,0,1,0.5] doit être transparent bleu
réglage de l'alpha à rien d'autre qu'un (la valeur par défaut pour une valeur RVB avec aucun alpha) signifie que vous pouvez voir le chevauchement, l'OP spécifié qu'ils ne veulent pas: "le chevauchement des points du même groupe ne changez pas la couleur"
OriginalL'auteur Ed Smith
C'est un terrible, terrible hack, mais il fonctionne.
Vous voyez bien que Matplotlib parcelles de points de données comme des objets distincts, qui peuvent se chevaucher, il trace la ligne entre eux comme un seul objet - même si la ligne est cassée en plusieurs morceaux par NaNs les données.
Avec cela à l'esprit, vous pouvez le faire:
Et chaque couleur se chevauchent avec l'autre couleur mais pas avec lui-même.
Seul inconvénient est que vous devez être prudent avec l'espacement entre les deux points que vous utilisez pour faire de chaque cercle. Si ils sont deux espacés puis la séparation sera visible sur votre parcelle de terrain, mais s'ils sont trop proches, et matplotlib n'est pas le tracé de la ligne. Cela signifie que la séparation doit être choisie en fonction de l'étendue de vos données, et si vous prévoyez de faire un interactif de la parcelle puis, il y a un risque de tous les points de données soudain de fuite si vous zoomez trop, d'étirement et si vous zoomez trop.
Comme vous pouvez le voir, j'ai trouvé 1e-5 pour être une bonne séparation de données avec une gamme de [0,1].
OriginalL'auteur Arcanist Lupus