Ручная метка ggplot с символами в виде значков - PullRequest
1 голос
/ 27 февраля 2020

У меня есть многослойный график, который включает отдельные точки (solid точек), средние значения для каждого класса (ограниченная точка) и "***", указывающие значения p.value.

library(ggplot2)
library(reshape2)
#layer1
layer1<- data.frame("class1"= sample(c("tall", "medium", "short"), 100, replace = TRUE),
                    "class2"= sample(c("red", "blue"), 100, replace = TRUE),
                    "value"= runif(100))
layer1<- melt(layer1)

#layer2
layer2<- data.frame("class1"= rep(c("tall", "medium", "short"), each=2),
                    "class2"= rep(c("red", "blue"), 3),
                    "value"= runif(6))

#layer3
layer3<- data.frame("class1"= c("tall", "medium", "short"),
                    "tag"= c("***", "**", "*"))

#el plot
plot<- ggplot() +
  geom_point(aes(x=class1, y=value, col=class2), data=layer1, position=position_dodge(0.5)) +
  geom_point(aes(x=class1, y=value, fill=class2), data=layer2, shape=21, size=2, position=position_dodge(0.5)) +
  geom_text(aes(x=class1, y=1), data=layer3, label=layer3$tag)

Я хочу построить легенда, похожая на эту desired legend, но у меня проблемы с ее выполнением. Есть ли какая-нибудь ручная функция легенды, которую я могу добавить как часть ggplot, например magic_legend (title = legend title, icons = c (1, 1, 21, ***, **, *), fills = c (красный, синий), метки = c (имя1, имя2, среднее значение, р <0,001, р <0,01, р <0,05) </p>

1 Ответ

2 голосов
/ 28 февраля 2020

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

plot<- ggplot() +
  geom_point(aes(x=class1, y=value, colour=class2), 
             data=layer1, position=position_dodge(0.5)) +
  geom_point(aes(x=class1, y=value, shape="Mean", fill = class2), 
             data=layer2, size=2, colour = "black",
             position=position_dodge(0.5)) +
  geom_text(aes(x=class1, y=1, label = tag), 
            data=layer3) +
  scale_fill_discrete(guide = guide_legend(override.aes = list(shape = 21, colour = NA))) +
  scale_shape_manual(values = 21) +
  scale_discrete_manual("label", 
                        values = c("*", "**", "***"),
                        labels = c("p<0.05", "p<0.01", "p<0.001"))

plot

enter image description here

...