Создание собственной легенды в plotnine

У меня проблемы с плотниной настройкой легенды за пределами того, что возможно через aes()

У меня есть следующий код:

import pandas as pd
from plotnine import *

data1 = {'dilution': [2.000000, 2.477121, 2.954243, 3.431364, 3.908485, 4.385606, 4.862728, 5.339849, 5.816970, 2.000000, 2.477121, 2.954243, 3.431364, 3.908485, 4.385606, 4.862728, 5.339849, 5.816970],
'variable': ["mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2"],
'value': [547.180708, 495.883622, 439.109089, 277.819313, 115.926188, 42.041189, 15.276367, 11.696537, 2.280014, 269.398164, 233.667531, 215.410352, 169.512070, 102.877518, 36.860550, 13.960504, 4.891481, -3.465304]}
df1 = pd.DataFrame.from_dict(data1)
data2 = {'dilution': [2.0, 2.0, 2.0],
'value': [-7.873768, -3.926121, 4.170833] }
df2 = pd.DataFrame.from_dict(data2)

data3 = {'dilution': [3.90309, 3.90309],
'value': [756.715198, 540.613828],
'variable': ["mouse 1", "mouse 2"]}
df3 = pd.DataFrame.from_dict(data3)

g = (ggplot(df1)
+ geom_line(aes(x='dilution', y='value', color='variable'), data=df1, size=1.0)
+ geom_point(aes(x='dilution', y='value', color='variable'), data=df1, size=1.0)
+ geom_point(aes(x='dilution', y='value'), data=df2, size=3.0)
+ geom_point(aes(x='dilution', y='value', color='variable'), data=df3, size=2.0, shape='s')
+ scale_x_continuous( )
)
print(g)

который производит следующий график:

пример сюжета с черными точками данных

Как вы можете видеть, дата назначения от df2 не появляются в легенде. Я хотел бы, чтобы одна черная точка в легенде представляла все точки df2, Я могу отобразить его в легенде, если я изменю data2 следующее:

data2 = {'dilution': [2.0, 2.0, 2.0],
'value': [-7.873768, -3.926121, 4.170833],
'type': ['test', 'test', 'test']}

и затем сопоставьте его с эстетикой следующим образом: geom_point(aes(x='dilution', y='value', color='type'), data=df2, size=3.0)

но тогда точки уже не черные, и я не могу снова изменить их на черные. Добавление в color='black' аргумент не работает:

пример прорисовки с цветными легендами

Есть ли лучшее решение для сохранения всех данных? df2 черный, хотя в легенде появляется только один раз как черная точка?

Во-вторых, есть ли способ добавить в легенду один черный квадрат, чтобы представить все точки данных из df3?

1 ответ

Решение

Легенда автоматическая. Единственный способ повлиять на него - это изменить data, aes картирование или scale параметры. Проблема в том, что вы пытаетесь создать слои с разными сопоставлениями, и все же ожидаете, что они разделят легенду.

Есть ли лучшее решение, чтобы сохранить все точки данных черного цвета df2, хотя в легенде он фигурирует только один раз как черная точка?

Решение состоит в том, чтобы манипулировать данными в единое связное целое или убедиться, что разные фреймы данных имеют одинаковые столбцы, которые отображаются на одну и ту же эстетику (вы, кажется, уже сделали это со вторым df2). Затем, если вы хотите контролировать цвета в легенде, вы должны использовать ручную шкалу.

+ scale_color_manual(['red', 'cyan', 'black'])

Во-вторых, есть ли способ добавить в легенду один черный квадрат, чтобы представить все точки данных из df3?

Нет способа сделать это.

Ключевым выводом является то, что легенда - это руководство для понимания данных, и если у вас есть желание манипулировать, какие элементы отображаются в нем, то данные, скорее всего, не были правильно организованы. Также, если вы хотите пометить "специальные" точки, используйте аннотации.

Другие вопросы по тегам