Для scatterplot с matplotlib, как включить в легенду градиент для размера и цвета точки? - PullRequest
0 голосов
/ 31 марта 2020

Я создаю два графика рассеяния с matplotlib в python с этим кодом, данные для кода здесь :

import matplotlib.pyplot as plt
from matplotlib.colors import Normalize

fig = plt.figure(figsize=(20,12))
ax1 = fig.add_subplot(111)
ax3 = ax1.twinx()

norm = Normalize(vmin=0.95*min(arr), vmax=1.05*max(arr))

ax1.scatter(x, y1, s=20, c=arr, cmap='Blues_r', norm=norm, marker='x', label='bla1')
ax3.scatter(x, y2, s=(20*(1.1-arr))**3.5, c=arr, cmap='Reds_r', norm=norm, marker='^', label='bla1')

Созданный рис. выглядит следующим образом: enter image description here

Итак, размер точки (в ax3) и цвет точки (в ax1 и ax3) берутся из массивов, содержащих числа с плавающей запятой со всеми видами значений в диапазон [0,1]. Мой вопрос: Как мне создать легенду, которая отображает соответствующие значения y для, скажем, 5 разных размеров точек и 5 разных цветовых нюансов?

Мне бы хотелось, чтобы легенда была похожа на рисунке ниже (источник здесь ), но с цветной полосой и полосой размера, по возможности, в одной легенде. Спасибо за предложения и код!

enter image description here

1 Ответ

1 голос
/ 31 марта 2020
# using your data in dataframe df

# create s2
df['s2'] = (20*(1.1-df.arr))**3.5

fig = plt.figure(figsize=(20,12))

ax1 = fig.add_subplot(111)
ax3 = ax1.twinx()

norm = Normalize(vmin=0.95*min(df.arr), vmax=1.05*max(df.arr))

p1 = ax1.scatter(df.x, df.y1, s=20, c=df.arr, cmap='Blues_r', norm=norm, marker='x')
fig.colorbar(p1, label='arr')
p2 = ax3.scatter(df.x, df.y2, s=df.s2, c=df.arr, cmap='Reds_r', norm=norm, marker='^')
fig.colorbar(p2, label='arr')


# create the size legend for red
for x in [15, 80, 150]:
    plt.scatter([], [], c='r', alpha=1, s=x, label=str(x), marker='^')
plt.legend(loc='upper center', bbox_to_anchor=(1.23, 1), ncol=1, fancybox=True, shadow=True, title='s2')

plt.show()

enter image description here

Отдельный

fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(20, 10))

norm = Normalize(vmin=0.95*min(df.arr), vmax=1.05*max(df.arr))

p1 = ax1.scatter(df.x, df.y1, s=20, c=df.arr, cmap='Blues_r', norm=norm, marker='x')
fig.colorbar(p1, ax=ax1, label='arr')
p2 = ax2.scatter(df.x, df.y2, s=df.s2, c=df.arr, cmap='Reds_r', norm=norm, marker='^')
fig.colorbar(p2, ax=ax2, label='arr')


# create the size legend for red
for x in [15, 80, 150]:
    plt.scatter([], [], c='r', alpha=1, s=x, label=str(x), marker='^')
plt.legend(loc='upper center', bbox_to_anchor=(1.2, 1), ncol=1, fancybox=True, shadow=True, title='s2')

plt.show()

enter image description here

...