#r #ggplot2 #legend #layer #pch
Вопрос:
У меня есть очень простой (хотя и большой) фрейм данных с 2 числовыми столбцами и 1 столбцом группировки символов, содержащим несколько NAs
.
Я собираюсь использовать iris
в качестве примера. Ниже я просто ввожу random NAs
в Species
столбец, который я хочу использовать для группировки и раскрашивания.
Что я здесь делаю, так это переделываю Species
столбец как фактор с «NA» (символ) в конце. Я делаю палитру с gray
в конце, которую я хочу, чтобы она соответствовала «NA».
data("iris") set.seed(123) na_rows lt;- sample(nrow(iris), 100, replace = F) iris$Species lt;- as.character(iris$Species) iris$Species[na_rows] lt;- "NA" mylevels lt;- iris$Species[which(iris$Species!="NA")] mylevels lt;- c(gtools::mixedsort(unique(mylevels)), "NA") iris$Species lt;- factor(iris$Species, levels=mylevels) plot_palette lt;- c("red","blue","green") plot_palette lt;- c(plot_palette[1:length(mylevels)-1], "gray")
Все хорошо до сих пор. Теперь я делаю свою диаграмму рассеяния вот так:
grDevices::pdf(file="test1.pdf", height=10, width=10) P lt;- ggplot2::ggplot(data=iris, ggplot2::aes(x=Sepal.Length, y=Sepal.Width, color=Species)) ggplot2::scale_color_manual(values=plot_palette) P1 lt;- P ggplot2::geom_point(pch=16, size=10, alpha=0.75) print(P1) grDevices::dev.off()
Это создает этот сюжет:
Все еще хорошо до сих пор. Это очень близко к тому, что я хочу, но мой фактический фрейм данных очень велик, и многие non-NA
точки скрыты за NA
ними.
To avoid this, I am trying to plot first the subset of NA
data, and then on an upper layer the subset of non-NA
data. I try the code below:
grDevices::pdf(file="test2.pdf", height=10, width=10) P lt;- ggplot2::ggplot(data=iris, ggplot2::aes(x=Sepal.Length, y=Sepal.Width, color=Species)) ggplot2::scale_color_manual(values=plot_palette) P1 lt;- P ggplot2::geom_point(data=function(x){x[x$Species == "NA", ]}, pch=15, size=10, alpha=0.75) ggplot2::geom_point(data=function(x){x[x$Species != "NA", ]}, pch=16, size=10, alpha=0.75) print(P1) grDevices::dev.off()
This produces this plot:
Проблема, с которой я столкнулся здесь, очень очевидна, но я понятия не имею, как ее решить.
Я просто хочу, чтобы этот второй сюжет был точно таким же, как и первый, за исключением «наслоения» с NA
точками позади. Я хочу сохранить первоначальный порядок Species
уровней в легенде, с NA
в конце, и то же цветовое соответствие, NA
связанное с gray
.
Обратите внимание, что я также изменил значение pch
для NA
очков. Бонусом было бы иметь легенду только с квадратом для NA
(внизу) и просто кругами для других образцов.
Какая-нибудь помощь? Спасибо!
Ответ №1:
Нет необходимости в нескольких слоях. Вы можете просто изменить порядок набора данных так, NA
чтобы сначала были нанесены s, а для фигур вы могли бы отобразить Species
их на shape
aes и задать желаемую форму с помощью scale_shape_manual
:
iris1 lt;- dplyr::arrange(iris, desc(Species)) P lt;- ggplot2::ggplot(data=iris1, ggplot2::aes(x=Sepal.Length, y=Sepal.Width, color=Species, shape = Species)) ggplot2::scale_color_manual(values=plot_palette) P ggplot2::geom_point(size=10, alpha=0.75) ggplot2::scale_shape_manual(values = c(16, 16, 16, 15))