Как изменить размер символа в ggplot2, если размер, форма и цвет заданы через geom_point?

Проблема, с которой я столкнулся, безусловно, тривиальна, но я не могу ее решить. Мне нужно иметь собственную форму, цвет и размер для 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)))

Возможно: ggplot(df, aes(x=x, y=y, color=category, size = size)) + geom_point() это то, что вы ищете? Не совсем ясно, какой ожидаемый результат требуется.

Peter 05.04.2024 11:58

@Питер, нет, это не ожидаемое поведение. мне нужно задать эстетику geom_point() части сюжета. и при этом иметь контроль над размером точек в финальной легенде. вот что не работает: я не могу установить размер в легенде.

gabt 05.04.2024 12:04

Итак, если я правильно вас понимаю, вы хотите, чтобы размер точек на графике менялся с помощью df$size, но в легенде вы хотите, чтобы ключ размера был последовательным, т. е. только один размер или что-то еще?

Peter 05.04.2024 12:09

да, и этот размер должен быть тем, который я выбрал. я ожидал, что это сработает, используя guides...override, но это не так. очевидно, это происходит после того, как я применил color и shape в части geom_point.

gabt 05.04.2024 12:10

В половине случаев size будет отрицательным, поскольку оно получено из нормального распределения. Я не проверял, является ли это причиной ошибки, но это кажется неправильным.

Rui Barradas 05.04.2024 12:11

@RuiBarradas, это всего лишь пример... мои реальные данные всегда положительны. хотя я могу попробовать.

gabt 05.04.2024 12:13

@Питер уже пробовал это, но все равно не работает!

gabt 05.04.2024 12:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может быть, это поможет?

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"?

gabt 05.04.2024 13:26

Это параметр внутри вызова guides(), указывающий, что легенды размера не должно быть, а только одна для заполнения. (Внутри aes() нет сопоставления цветов, поэтому часть color внутри guides() здесь, вероятно, избыточна.)

Jon Spring 05.04.2024 16:54

@JonSpring Спасибо за комментарий: вы правы colour аргумент guides() излишен - я просто брал код из ОП, например. Настройка @gabt guides(size = "none"), как отмечает @JonSpring, является аргументом в пользу предотвращения раскрытия легенды, связанной с размером.

Peter 05.04.2024 17:59

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