圆形图与颜色条

3

我想做一个带有颜色条的圆形绘图,就像这样:

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

原问题的来源: 使用scatter绘制没有填充颜色、颜色和大小取决于变量的圆圈

3个回答

2

只需在plt.scatter()中添加vminvmax参数。

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

在这里输入图片描述

如果您想根据颜色图来调整圆圈的颜色,则需要使用“Normalize(vmin,vmax)”,并使用归一化的值将颜色图传递给圆圈绘图。

以下是代码:

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

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]
cmap = cm.jet
vmin = 0
vmax = 5 #your max Y is 5, not 4
norm = Normalize(vmin, vmax)

# Graph
plt.figure()
ax = plt.gca()
for a, b in zip(df['A'], df['B']):
    circle = plt.Circle((a, 
                         b), 
                         1, # Size
                         color=cmap(norm(b)), 
                         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',
                 vmin = vmin,
                 vmax = vmax,
                 facecolors='none')
plt.grid()

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

plt.show()

enter image description here


这已经改变了颜色条的最小值,这正是我所要求的。然而,它并没有改变圆圈的颜色。因此,圆圈的颜色与颜色条不一致。我想我需要在两个图表上以某种方式做同样的事情。 - R. Cox
是的,那是另一个问题。我在答案中添加了一个解决方案。 - alec_djinn
我不知道为什么,但现在它使用B来设置圆的颜色,而不是C! - R. Cox
color=cmap(norm(b)) 这行代码是根据你的 b 变量设置颜色,你可以使用任何你想要的变量。我假设你想使用 b,它是你圆心 Y 轴值的中心。 - alec_djinn

0

您可以调整扩展参数以获得此输出:

fraction = 1/3 # colorbar axis min is 1, max is 4, steps are 0.5 
               # => 2*(1/6) to get to 0
cbar = plt.colorbar(sc, extend="min", extendfrac=fraction, extendrect=True)

enter image description here

但是该扩展名将没有标签。


0
感谢alec_djinn提供的答案,它可以:
  • 设置颜色条的最小值和最大值
  • 控制圆圈(变量C)的颜色范围与颜色条相同

enter image description here

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

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

# set the Colour
x              = df[['C']].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[0]
cmap           = cm.jet # Use the same Cmap

# Set the Colour Scale
vmin = 0
vmax = 5
norm = Normalize(vmin, vmax)

# Graph
plt.figure()
ax = plt.gca()
for a, b, c in zip(df['A'], df['B'], df['C']):
    circle = plt.Circle((a, 
                         b), 
                         1, # Size
                         color=cmap(norm(c)), 
                         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', # Use the same Cmap
                 vmin = vmin,
                 vmax = vmax,
                 facecolors='none')
plt.grid()
cbar = plt.colorbar(sc)
cbar.set_label('C', rotation=270, labelpad=20)

plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接