сопоставление формы, цвета и легенды в пузырьковом графике с подмножеством переменных - PullRequest
1 голос
/ 08 апреля 2020

У меня есть некоторые данные

library(data.table)
wide <- data.table(id=c("A","C","B"), var1=c(1,6,1), var2=c(2,6,5), size1=c(11,12,13), size2=c(10,12,10), flag=c(FALSE,TRUE,FALSE))
> wide
   id var1 var2 size1 size2  flag
1:  A    1    2    11    10 FALSE
2:  C    6    6    12    12  TRUE
3:  B    1    5    13    10 FALSE

, которые я хотел бы построить в виде пузырьковых диаграмм, где id упорядочено по var2, а пузырьки следующие: ID A и B: var1 наносится на size1, а "пустые пузырьки" и var2 на size2 - на "заполненные" пузырьки. ID C помечен, потому что есть только одно значение (именно поэтому var1=var2), и у него должен быть «заполненный пузырь» другого цвета.

Я пробовал это следующим образом:

cols <- c("v1"="blue", "v2"="red", "flags"="green")
shapes <- c("v1"=16, "v2"=21, "flags"=16)
p1 <- ggplot(data = wide, aes(x = reorder(id,var2))) + scale_size_continuous(range=c(5,15))
p1 <- p1 + geom_point(aes(size=size1, y = var1, color = "v1", shape = "v1")) 
p1 <- p1 + geom_point(aes(size=size2, y = var2, color = "v2", shape = "v2", stroke=1.5))
p1 <- p1 + geom_point(data=subset(wide,flag), aes(size=size2[flag], y=var2[flag], color= "flags", shape="flags"))
p1 <- p1 + scale_color_manual(name = "test", 
                                values = cols,
                                labels = c("v1", "v2", "flags"))
p1 <- p1 + scale_shape_manual(name = "test", 
                              values = shapes,
                              labels = c("v1", "v2", "flags"))

, который дает (в моей теме)

output

, но остаются два вопроса:

  1. Что произошло на порядок в легенде? Я следовал рецепту нижнего решения в Два geom_points добавить легенду , но почему-то порядок не совпадает.
  2. Как избавиться от обводки вокруг зеленого пузыря и почему это там?

В целом, что-то кажется go неправильным в соответствии формы и цвета.

1 Ответ

2 голосов
/ 08 апреля 2020

Признаюсь, мне потребовалось некоторое время, чтобы понять ваш немного запутанный заговор. Простите, но я позволил себе изменить способ построения и использовать (лучше?) Использование ggplot.

Форма данных меньше идеальной. ggplot очень хорошо работает с длинными данными. Чтобы изменить ваши данные, было немного догадок, и я решил go быстрый и грязный способ простого связывания строк из выбранных столбцов.

Теперь вы можете видеть, что вы можете достичь нового сюжета одним вызовом geom_point. Остальное - "scale_aestheti c" magi c ...

Для того, чтобы объединить легенду о форме и цвете, безопаснее всего использовать override.aes. Но будьте осторожны! Он не принимает именованные векторы, поэтому порядок значений должен быть в точном порядке, заданном вашими ключами легенды - обычно это алфавит c, если у вас не определены уровни факторов.

update re: запрос на заказ x меток

Это в значительной степени зависит от фактической структуры данных. если бы это было изначально, как вы представили, я бы first сделал бы id фактором с упорядоченными уровнями на основе вашего var2. Затем выполните формирование данных.

library(tidyverse)
# data reshape
wide <- data.frame(id=c("C","B","A"), var1=c(1,6,1), var2=c(2,6,5), size1=c(11,12,13), size2=c(10,12,10), flag=c(FALSE,TRUE,FALSE))
wide <- wide %>% mutate(id = reorder(id, var2))

wide1 <- wide %>% filter(!flag) %>%select(id, var = var1, size = size1)
wide2 <- wide %>%  filter(!flag) %>% select(id, var = var2, size = size2)
wide3 <- wide %>% filter(flag) %>% select(id, var = flag, size = size2) %>%
  mutate(var = 6)
long <- bind_rows(list(v1 = wide1, v2 = wide2, flag = wide3), .id = "var_id") 

# rearrange the vectors for scales aesthetic
cols <- c(flag="green", v1 ="blue", v2="red" )
shapes <- c(flag=16, v1=16, v2 =21 )

ggplot(data = long, aes(x = id, y = var)) + 
  geom_point(aes(size=size, shape = var_id, color = var_id), stroke=1.5) +
  scale_size_continuous(limits = c(5,15),breaks = seq(5,15,5)) +
  scale_shape_manual(name = "test", values = shapes) +
  scale_color_manual(values = cols, guide = FALSE) +
  guides(shape = guide_legend(override.aes = list(color  = cols)))

PS причина, по которой красный штрих вокруг зеленого пузыря на вашем графике, вы также наносили на график «var2» за своим флагом.

Создано в 2020-04-08 пакетом prepx (v0.3.0)

...