web-dev-qa-db-de.com

Zeichnen Sie Kreise ohne Füllung, Farbe und Größe in Abhängigkeit von Variablen mithilfe der Streuung

Die Informationen, die ich auf einer Zeichnung anzeigen muss, sind zwei Koordinaten: Größe und Farbe (keine Füllung). Die Farbe ist wichtig, da ich ein Diagramm vom Typ "colormap" benötige, um die Informationen in Abhängigkeit von einem Farbwert anzuzeigen. 

Ich habe zwei verschiedene Möglichkeiten ausprobiert:

  1. Erstellen Sie bestimmte Kreise und fügen Sie die einzelnen Kreise hinzu.

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

Das Problem bei dieser Methode war, dass ich keine Möglichkeit fand, die Farbe in Abhängigkeit von einem Farbwert festzulegen. für einen Wertebereich von 0 bis 1 möchte ich, dass 0 vollständig blau ist, während 1 vollständig rot ist. Dazwischen liegen verschiedene Schattierungen von Purpur, deren Rötung/Blauheit davon abhängt, wie hoch/niedrig der Farbwert ist. 

  1. Danach habe ich versucht, die Streufunktion zu verwenden: 

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

Das Problem bei dieser Methode war, dass die Größe nicht zu variieren schien. Möglicherweise liegt es auch daran, wie ich die Array-Größe erstellt habe. Wenn ich also die Größe durch eine große Zahl ersetze, zeigt der Plot farbig im Kreis. Der facecolours = 'none' sollte nur den Umfang darstellen.

4
Raket Makhim

Ich glaube, dass beide Ansätze das erreichen können, was Sie versuchen. Zeichnen Sie zuerst die nicht ausgefüllten Kreise, und erstellen Sie dann ein Streudiagramm mit den gleichen Punkten. Legen Sie für die Streudiagramme die Größe 0 fest, legen Sie jedoch die Farbleiste fest.

Betrachten Sie das folgende Beispiel:

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

Beispieldarstellung aus einem meiner Läufe:

 Example plot output

5
pault

@ Raket Makhim schrieb:

"I'm only getting one colour"

& @pault antwortete:

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

Ich habe das umgesetzt:

 enter image description here

(Der minimale Wert des Farbbalkens ist jedoch derzeit 1; ich möchte ihn auf 0 setzen können. Ich werde eine neue Frage stellen.)

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