Проблема, с которой я столкнулся, безусловно, тривиальна, но я не могу ее решить. Мне нужно иметь собственную форму, цвет и размер для geom_point()
. Однако, если я его установлю, размер символов в легенде не изменится.
Итак, скажем, я хочу построить это:
library("ggplot2")
x <- rnorm(2000, 0, 1)
y <- rnorm(2000, 0, 1)
category <- sample(c("one", "two"), 2000, replace = TRUE)
size <- rnorm(2000, 0, 1)*10
df <- data.frame(x, y, category, size)
dev.new()
ggplot(df, aes(x=x, y=y, color=category)) +
geom_point(size = df$size) +
guides(color = guide_legend(override.aes = list(size = 10)))
Но тогда, если я захочу изменить внешний вид своего geom_point()
, я не смогу установить размер точек в легенде. Другими словами, это больше не работает:
dev.new()
ggplot(df, aes(x=x, y=y, fill=category)) +
geom_point(shape=21, colour = "black", size = df$size) +
guides(color = guide_legend(override.aes = list(size = 10)))
Я чувствую, что мне следует передать направляющим больше параметров, но, возможно, нет. Что делать?
Я не могу найти ответа на свой вопрос. Если да, отметьте это как дубликат и добавьте ссылку. Спасибо!
Обновлено:
ожидаемый результат представлен вторым графиком, который я предоставил (где я установил эстетику для geom_point()
), но тогда мне нужны точки в легенде такого размера, как я хочу.
Обновлено еще раз:
использование sample
вместо rnorm
(как предложено в комментарии), кажется, дает ту же проблему:
library("ggplot2")
x <- sample(2000, 1000, replace=T)
y <- sample(2000, 1000, replace=T)
category <- sample(c("one", "two"), 2000, replace = TRUE)
size <- sample(2000, 1000, replace=T)/50
df <- data.frame(x, y, category, size)
dev.new()
ggplot(df, aes(x=x, y=y, color=category)) +
geom_point(size = df$size) +
guides(color = guide_legend(override.aes = list(size = 10)))
dev.new()
ggplot(df, aes(x=x, y=y, fill=category)) +
geom_point(shape=21, colour = "black", size = df$size) +
guides(color = guide_legend(override.aes = list(size = 10)))
@Питер, нет, это не ожидаемое поведение. мне нужно задать эстетику geom_point()
части сюжета. и при этом иметь контроль над размером точек в финальной легенде. вот что не работает: я не могу установить размер в легенде.
Итак, если я правильно вас понимаю, вы хотите, чтобы размер точек на графике менялся с помощью df$size
, но в легенде вы хотите, чтобы ключ размера был последовательным, т. е. только один размер или что-то еще?
да, и этот размер должен быть тем, который я выбрал. я ожидал, что это сработает, используя guides...override
, но это не так. очевидно, это происходит после того, как я применил color
и shape
в части geom_point
.
В половине случаев size
будет отрицательным, поскольку оно получено из нормального распределения. Я не проверял, является ли это причиной ошибки, но это кажется неправильным.
@RuiBarradas, это всего лишь пример... мои реальные данные всегда положительны. хотя я могу попробовать.
@Питер уже пробовал это, но все равно не работает!
Может быть, это поможет?
library(ggplot2)
set.seed(213)
x <- rnorm(2000, 0, 1)
y <- rnorm(2000, 0, 1)
category <- sample(c("one", "two"), 2000, replace = TRUE)
size <- rnorm(2000, 0, 1)*10
ggplot(df, aes(x = x, y=y, fill = category)) +
geom_point(shape = 21, aes(size = size)) +
guides(fill = guide_legend(override.aes = list(size = 5)),
size = "none")
да! это действительно работает... но почему? почему ты поставил size = "none"
?
Это параметр внутри вызова guides()
, указывающий, что легенды размера не должно быть, а только одна для заполнения. (Внутри aes()
нет сопоставления цветов, поэтому часть color
внутри guides()
здесь, вероятно, избыточна.)
@JonSpring Спасибо за комментарий: вы правы colour
аргумент guides()
излишен - я просто брал код из ОП, например. Настройка @gabt guides(size = "none")
, как отмечает @JonSpring, является аргументом в пользу предотвращения раскрытия легенды, связанной с размером.
Возможно:
ggplot(df, aes(x=x, y=y, color=category, size = size)) + geom_point()
это то, что вы ищете? Не совсем ясно, какой ожидаемый результат требуется.