Trazando círculos sin relleno, color y tamaño dependiendo de las variables usando dispersión

La información que tengo que mostrar en un gráfico son 2 coordenadas: tamaño y color (sin relleno). El color es importante ya que necesito un tipo de gráfico de mapa de colores para mostrar la información según el valor del color.

Intenté dos maneras diferentes de hacer esto:

  1. Crea círculos específicos y agrega los círculos individuales.

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

El problema con este método era que no podía encontrar una manera de establecer el color según el valor del color. es decir, para un rango de valores de 0 a 1, quiero que 0 sea completamente azul mientras que 1 sea completamente rojo, por lo que hay diferentes tonos de púrpura cuyo enrojecimiento / color azul depende de cuán alto / bajo sea el valor del color.

  1. Después de eso intenté usar la función de dispersión:

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

El problema con este método era que el tamaño no parecía variar, posiblemente podría ser la causa de la forma en que he creado el tamaño del arreglo. Por lo tanto, si sustituyo el tamaño con un número grande, la ttwig se muestra coloreada en círculos. Los facecolours = 'none' estaban destinados a trazar la circunferencia solamente.

Creo que hacer ambos enfoques puede lograr lo que estás tratando de hacer. Primero dibuja los círculos sin rellenar, luego haz un diagtwig de dispersión con los mismos puntos. Para los gráficos de dispersión, haga el tamaño 0 pero utilícelo para establecer la barra de colores.

Considere el siguiente ejemplo:

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

Ejemplo de ttwig de una de mis carreras:

Ejemplo de salida de gráfico

@Raket Makhim escribió:

 "I'm only getting one colour" 

& @pault respondió:

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

He implementado eso:

introduzca la descripción de la imagen aquí

(Sin embargo, el valor mínimo de la barra de color es actualmente 1; me gustaría poder configurarlo en 0. Haré una nueva pregunta)

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