Поначалу довольно сложно сказать конкретное, не зная структуры ваших данных в кадре данных, поэтому, пожалуйста, рассмотрите возможность публикации, например. RGDFT8mm.head()
Тем не менее, я вижу, по крайней мере, из вашего кода, что вы смешали красные и синие данные в одном кадре данных без группировки (= разделения) перед построением точечной диаграммы. Поэтому одна команда разброса содержит оба цвета, что делает невозможным получение одного цвета на переднем плане.
Если вы реструктурируете так, что каждая команда разброса отображает только один цвет, каждый разброс будет нанесен поверх предыдущего, и, кроме того, вы можете использовать zorder
kwarg для определения слоя каждого набора данных по собственному желанию.
Для группировки вы можете использовать sth, как RGDFT8mm.groupby('SzT')
- однако, чтобы дать полезные подсказки, я бы подождал, чтобы точно знать структуру вашего фрейма данных.
Но мое первое предположение будет:
for grpname, grpdata in RGDFT8mm.groupby('SzT'):
ax1.scatter(grpdata['Pcp'], grpdata['Pcp_3day'])
ax2.scatter(grpdata['Pcp'], grpdata['Pcp_7day'])
ax3.scatter(grpdata['Pcp'], grpdata['Pcp_14day'])
ax4.scatter(grpdata['Pcp'], grpdata['Pcp_28day'])
Редактировать
Примеры для уточнения
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = lambda n: np.random.lognormal(sigma=.5, size=n)
np.random.seed(42)
df = pd.DataFrame({'Pcp': data(500), 'Pcp_3day': data(500), 'SzT': (np.random.random(500)>.9).astype(int)})
print(df.head())
fig, axs = plt.subplots(2, 2, sharex=True, sharey=True)
szt_hi = df.SzT > 0
axs[0, 0].set_title('plot red before blue')
axs[0, 0].scatter(df.loc[szt_hi, 'Pcp'], df.loc[szt_hi, 'Pcp_3day'], c='r', label='SzT=1')
axs[0, 0].scatter(df.loc[~szt_hi, 'Pcp'], df.loc[~szt_hi, 'Pcp_3day'], c='b', label='SzT=0')
axs[0, 0].legend()
axs[0, 1].set_title('plot blue before red')
axs[0, 1].scatter(df.loc[~szt_hi, 'Pcp'], df.loc[~szt_hi, 'Pcp_3day'], c='b', label='SzT=0')
axs[0, 1].scatter(df.loc[szt_hi, 'Pcp'], df.loc[szt_hi, 'Pcp_3day'], c='r', label='SzT=1')
axs[0, 1].legend()
colors = {0 : 'b', 1 : 'r'}
layer = {0: 1, 1: 0}
axs[1, 0].set_title('plot by looping over groups\n(leading to blue first here)')
for i, (n, g) in enumerate(df.groupby('SzT')):
axs[1, 0].scatter(g.Pcp, g.Pcp_3day, c=colors[i], label='SzT={}'.format(n))
axs[1, 0].legend()
axs[1, 1].set_title('plot by looping over groups \n(leading to blue first here)\nwith manipulating zorder')
for i, (n, g) in enumerate(df.groupby('SzT')):
axs[1, 1].scatter(g.Pcp, g.Pcp_3day, c=colors[i], zorder=layer[i], label='SzT={}'.format(n))
axs[1, 1].legend()
plt.show()
![enter image description here](https://i.stack.imgur.com/A85OD.jpg)
... для печати legend
меньше раз можно было бы зациклить все оси, как
for a in axs.flatten():
a.legend()
после построения всех участков.
Однако в вашем случае, в отличие от моих примеров, ваши легенды были бы одинаковыми, так что одна легенда для всей фигуры была бы лучше. Для этого просто используйте
fig.legend()
изменяемый с такими же параметрами, как легенды оси.