Вы пытаетесь использовать ggplot
, как если бы это была базовая графика ... для изменения мышления может потребоваться некоторое время, чтобы привыкнуть. Ответ DC37 показывает, как вы должны это сделать. Я попытаюсь объяснить, что не так в вашей попытке:
Когда вы помещаете fill = green_color
внутрь aes()
, , потому что оно внутри aes()
ggplot
по существу создает новый столбец данных, заполненных значениями green_color
в вашем green_data_frame
, то есть "#008000", "#008000", "#008000", ...
. То же самое относится к значениям красного цвета в красном фрейме данных. Мы можем увидеть это, если мы изменим ваш график, просто удалив scale
:
ggplot() +
geom_density(aes(x = red_variable, fill = green_color, alpha = 0.5), data =
red_dataframe) +
geom_density(aes(x = green_variable, fill = red_color, alpha = 0.5), data =
green_dataframe) +
xlab("X value") +
ylab("Density") +
labs(fill = "Legend") +
guides(alpha = FALSE)
Мы действительно можем получить то, что вы хотите, поставив identity
шкала, предназначенная для (распространенного в base
, редко встречающегося в ggplot2
) случая, когда вы фактически помещаете значения цветов в данные.
ggplot() +
geom_density(aes(x = red_variable, fill = green_color, alpha = 0.5), data =
red_dataframe) +
geom_density(aes(x = green_variable, fill = red_color, alpha = 0.5), data =
green_dataframe) +
scale_fill_identity() +
xlab("X value") +
ylab("Density") +
labs(fill = "Legend") +
guides(alpha = FALSE)
Когда вы добавили scale_fill_manual
, ggplot выглядел как «хорошо, круто, вы хотите указать цвета и метки». Но вы думали в том порядке, в котором вы добавили слои на график (очень похоже на базовую графику), тогда как ggplot
думал об этих вновь созданных переменных "#FF0000"
и "#008000"
, которые он упорядочил в алфавитном порядке по умолчанию (как если бы они были factor
или character
столбцами во фрейме данных). И так как вы случайно добавили слои в обратном алфавитном порядке, он был переключен. Ответ
dc37 показывает пару лучших методов. С ggplot
вы должны (а) по возможности работать с одним длинным форматом фрейма данных (б) не помещать константы в aes()
(постоянный цвет, постоянная альфа и т. Д. c.), (c) установить цвета в функции scale_fill_*
или scale_color_*
, когда они не постоянны.