web-dev-qa-db-fra.com

Tracer des cercles sans remplissage, couleur et taille en fonction des variables en utilisant scatter

Les informations que je dois montrer sur un tracé sont 2 coordonnées: taille et couleur (pas de remplissage). La couleur est importante car j'ai besoin d'un type de graphique de palette de couleurs pour afficher les informations en fonction d'une valeur de couleur. 

J'ai essayé deux façons différentes de le faire:

  1. Créez des cercles spécifiques et ajoutez les cercles individuels.

    circle1 = plt.Circle(x, y, size, color='black', fill=False)
            ax.add_artist(circle1)
    

Le problème avec cette méthode était que je ne pouvais pas trouver un moyen de définir la couleur en fonction d'une valeur de couleur. c’est-à-dire que pour une plage de valeurs de 0 à 1, je veux que 0 soit entièrement bleu, tandis que 1 soit entièrement rouge, les deux nuances de violet étant différentes. 

  1. Après cela, j'ai essayé d'utiliser la fonction scatter: 

    size.append(float(Info[i][8]))
    plt.scatter(x, y, c=color, cmap='jet', s=size, facecolors='none')
    

Le problème avec cette méthode était que la taille ne semblait pas varier, cela pourrait être dû à la façon dont j'ai créé la taille du tableau. Par conséquent, si je remplace la taille par un grand nombre, l’intrigue est colorée en cercles. Le facecolours = 'none' était destiné à tracer la circonférence uniquement.

4
Raket Makhim

Je crois que les deux approches peuvent réaliser ce que vous essayez de faire. Commencez par dessiner les cercles non remplis, puis faites un diagramme avec les mêmes points. Pour les diagrammes de dispersion, faites la taille 0 mais utilisez-la pour définir la barre de couleur.

Prenons l'exemple suivant:

import numpy as np
from matplotlib import pyplot as plt
import matplotlib.cm as cm

%matplotlib inline

# generate some random data
npoints = 5
x = np.random.randn(npoints)
y = np.random.randn(npoints)

# make the size proportional to the distance from the Origin
s = [0.1*np.linalg.norm([a, b]) for a, b in Zip(x, y)]
s = [a / max(s) for a in s]  # scale

# set color based on size
c = s
colors = [cm.jet(color) for color in c]  # gets the RGBA values from a float

# create a new figure
plt.figure()
ax = plt.gca()
for a, b, color, size in Zip(x, y, colors, s):
    # plot circles using the RGBA colors
    circle = plt.Circle((a, b), size, color=color, fill=False)
    ax.add_artist(circle)

# you may need to adjust the lims based on your data
minxy = 1.5*min(min(x), min(y))
maxxy = 1.5*max(max(x), max(y))
plt.xlim([minxy, maxxy])
plt.ylim([minxy, maxxy])
ax.set_aspect(1.0)  # make aspect ratio square

# plot the scatter plot
plt.scatter(x,y,s=0, c=c, cmap='jet', facecolors='none')
plt.grid()
plt.colorbar()  # this works because of the scatter
plt.show()

Exemple de tracé d'une de mes courses:

 Example plot output

5
pault

@Raket Makhim a écrit:

"I'm only getting one colour"

& @pault a répondu:

"Try scaling your colors to the range 0 to 1." 

J'ai implémenté ça:

 enter image description here

(Cependant, la valeur minimale de la barre de couleur est actuellement de 1; j'aimerais pouvoir définir la valeur sur 0. Je vais poser une nouvelle question)

import pandas            as pd
import matplotlib.pyplot as plt
import matplotlib.cm     as cm
from sklearn import preprocessing

df = pd.DataFrame({'A':[1,2,1,2,3,4,2,1,4], 
                   'B':[3,1,5,1,2,4,5,2,3], 
                   'C':[4,2,4,1,3,3,4,2,1]})

# set the Colour
x              = df.values
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled       = min_max_scaler.fit_transform(x)
df_S           = pd.DataFrame(x_scaled)
c1             = df['C']
c2             = df_S[2]
colors         = [cm.jet(color) for color in c2]

# Graph
plt.figure()
ax = plt.gca()
for a, b, color in Zip(df['A'], df['B'], colors):
    circle = plt.Circle((a, 
                         b), 
                         1, # Size
                         color=color, 
                         lw=5, 
                         fill=False)
    ax.add_artist(circle)

plt.xlim([0,5])
plt.ylim([0,5])
plt.xlabel('A')
plt.ylabel('B')
ax.set_aspect(1.0)

sc = plt.scatter(df['A'], 
                 df['B'], 
                 s=0, 
                 c=c1, 
                 cmap='jet', 
                 facecolors='none')
plt.grid()

cbar = plt.colorbar(sc)
cbar.set_label('C', rotation=270, labelpad=10)

plt.show()
1
R. Cox