R ggplot2: сохраняйте исходные цвета и порядок группового уровня при построении подмножеств данных на разных слоях

#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()  

Это создает этот сюжет:

тест1

Все еще хорошо до сих пор. Это очень близко к тому, что я хочу, но мой фактический фрейм данных очень велик, и многие 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:

тест2

Проблема, с которой я столкнулся здесь, очень очевидна, но я понятия не имею, как ее решить.

Я просто хочу, чтобы этот второй сюжет был точно таким же, как и первый, за исключением «наслоения» с 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))