web-dev-qa-db-ja.com

散乱を使用する変数に応じて、塗りつぶしなし、色、サイズなしで円をプロットする

プロットに表示する必要がある情報は、サイズと色(塗りつぶしなし)の2つの座標です。色の値に応じて情報を表示するには、カラーマップタイプのグラフが必要なので、色は重要です。

私はこれを行う2つの異なる方法を試しました:

  1. 特定のサークルを作成し、個々のサークルを追加します。

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

この方法の問題は、色の値に応じて色を設定する方法が見つからないことでした。つまり、値の範囲が0-1の場合、0を完全に青、1を完全に赤にしたいので、その中間にある赤/青が色の値の高低に応じて異なる紫の色合いになります。

  1. その後、散布関数を使用してみました:

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

この方法の問題は、サイズが変化していないように見えることでした。これが、配列サイズの作成方法の原因である可能性があります。したがって、サイズを大きな数値に置き換えると、プロットは円で色分けされて表示されます。 facecolours = 'none'は、円周のみをプロットするためのものでした。

8
Raket Makhim

両方のアプローチを行うことで、あなたがやろうとしていることを達成できると思います。最初に塗りつぶされていない円を描き、次に同じ点で散布図を作成します。散布図の場合、サイズを0にしますが、それを使用してカラーバーを設定します。

次の例について考えてみます。

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

私の実行の1つからのプロット例:

Example plot output

8
pault

@Raket Makhimが書いた:

"I'm only getting one colour"

&@paultが返信しました:

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

私はそれを実装しました:

enter image description here

(ただし、カラーバーの最小値は現在1です。0に設定できるようにしたいと思います。新しい質問をします)

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()
2
R. Cox