контролирующий порядок точек в ggplot2 в R?

Предположим, что я рисую плотный график рассеяния в ggplot2 в R, где каждая точка может быть помечена другим цветом:

df <- data.frame(x=rnorm(500)) df$y = rnorm(500)*0.1 + df$x df$label <- c("a") df$label[50] <- "point" df$size <- 2 ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size)) 

Когда я это делаю, точка разброса, обозначенная как «точка» (зеленая), наносится поверх красных точек с меткой «a». Что контролирует этот порядок z в ggplot, т. Е. Какие элементы управления находятся над ними? Например, что, если бы я хотел, чтобы все точки «а» находились поверх всех точек, помеченных как «точка» (что означает, что они иногда частично или полностью скрывают эту точку)? Это зависит от буквенно-цифрового упорядочения меток? Я хотел бы найти решение, которое можно легко перевести на rpy2. благодаря

ggplot2 будет создавать графики ggplot2 и внутри каждого слоя, порядок построения определяется типом geom . По умолчанию используется график в том порядке, в котором они отображаются в data .

Там, где это отличается, отмечается. Например

geom_line

Подключить наблюдения, упорядоченные по значению x.

а также

geom_path

Подключить наблюдения в порядке данных


Существуют также известные проблемы, связанные с упорядочением factors , и интересно отметить ответ автора пакета Хэдли

Отображение графика должно быть инвариантным к порядку кадра данных – все остальное является ошибкой.


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


Создайте второй слой

Если вы хотите, чтобы определенные значения отображались над другими значениями, вы можете использовать аргумент subset для создания второго слоя, который определенно будет нарисован впоследствии. Вам нужно будет явно загрузить пакет plyr так .() Будет работать.

 set.seed(1234) df <- data.frame(x=rnorm(500)) df$y = rnorm(500)*0.1 + df$x df$label <- c("a") df$label[50] <- "point" df$size <- 2 library(plyr) ggplot(df) + geom_point(aes(x = x, y = y, color = label, size = size)) + geom_point(aes(x = x, y = y, color = label, size = size), subset = .(label == 'point')) 

введите описание изображения здесь

Обновить

В ggplot2_2.0.0 аргумент subset устарел. Используйте, например, base::subset чтобы выбрать соответствующие данные, указанные в аргументе data . И не нужно загружать plyr :

 ggplot(df) + geom_point(aes(x = x, y = y, color = label, size = size)) + geom_point(data = subset(df, label == 'point'), aes(x = x, y = y, color = label, size = size)) 

Или используйте alpha

Другим подходом, чтобы избежать проблемы переназначения, было бы установить alpha (прозрачность) точек. Это будет не так эффективно, как явный подход второго уровня выше, однако, при разумном использовании scale_alpha_manual вы должны иметь возможность работать над чем-то.

например

 # set alpha = 1 (no transparency) for your point(s) of interest # and a low value otherwise ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size,alpha = label)) + scale_alpha_manual(guide='none', values = list(a = 0.2, point = 1)) 

введите описание изображения здесь

2016 Обновление:

Эстетичность заказа устарела , поэтому в этот момент самым простым способом является сортировка data.frame так, чтобы зеленая точка была внизу и была построена последним. Если вы не хотите изменять исходный файл data.frame, вы можете сортировать его во время вызова ggplot – вот пример, который использует %>% и arrange из пакета dplyr, чтобы выполнить сортировку «на лету»:

 library(dplyr) ggplot(df %>% arrange(label), aes(x = x, y = y, color = label, size = size)) + geom_point() 

введите описание изображения здесь

Исходный ответ 2015 года для версий ggplot2 <2.0.0

В ggplot2 вы можете использовать эстетику заказа, чтобы указать порядок, в котором отображаются точки. Самые последние из них будут отображаться сверху. Чтобы применить это, вы можете создать переменную с порядком, в котором вы хотите нарисовать точки.

Чтобы поставить зеленую точку сверху, построив ее после других:

 df$order <- ifelse(df$label=="a", 1, 2) ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=order)) 

Или сначала нарисовать зеленую точку и похоронить ее, нарисуйте точки в обратном порядке:

 ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=-order)) 

Для этого простого примера вы можете пропустить создание новой переменной сортировки и просто принудить переменную label к коэффициенту, а затем цифру:

 ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=as.numeric(factor(df$label)))) 

Основной вопрос здесь можно перефразировать следующим образом:

Как управлять слоями моего сюжета?

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

Подготовка . Подготовьте образцы данных. Этот шаг необходим только для этого примера, потому что у нас нет реальных данных для работы.

 # Establish random seed to make data reproducible. set.seed(1) # Generate sample data. df <- data.frame(x=rnorm(500)) df$y = rnorm(500)*0.1 + df$x # Initialize 'label' and 'size' default values. df$label <- "a" df$size <- 2 # Label and size our "special" point. df$label[50] <- "point" df$size[50] <- 4 

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

Шаг 1 : Разделите свои данные на слои. Всегда делайте это, прежде чем использовать функцию «ggplot». Слишком много людей застревают, пытаясь манипулировать данными с помощью функций ggplot. Здесь мы хотим создать два слоя: один с метками «a» и один с метками «point».

 df_layer_1 <- df[df$label=="a",] df_layer_2 <- df[df$label=="point",] 

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

Шаг 2 : Поместите данные в виде слоев. Мы хотим сначала построить все «а», а затем построить все «точечные» данные.

 ggplot() + geom_point( data=df_layer_1, aes(x=x, y=y), colour="orange", size=df_layer_1$size) + geom_point( data=df_layer_2, aes(x=x, y=y), colour="blue", size=df_layer_2$size) 

демо-диаграмма

Обратите внимание, что для базового графического слоя ggplot() нет назначенных данных. Это важно, потому что мы будем переопределять данные для каждого слоя. Затем мы имеем два отдельных геометрии геометрии точки геометрии geom_point(...) которые используют свои собственные спецификации. Ось x и y будет разделяться, но мы будем использовать разные данные, цвета и размеры.

Важно переместить спецификации цвета и размера за пределы функции aes(...) , чтобы мы могли точно указать эти значения. В противном случае функция «ggplot» обычно назначает цвета и размеры в соответствии с уровнями, найденными в данных. Например, если у вас есть значения размера 2 и 5 в данных, он назначит размер по умолчанию для любых вхождений значения 2 и назначит некоторый больший размер для любых вхождений значения 5. Спецификация функции «aes» будет не используйте значения 2 и 5 для размеров. То же самое касается цветов. У меня есть точные размеры и цвета, которые я хочу использовать, поэтому я переношу эти аргументы в функцию «geom_plot». Кроме того, любые спецификации функции «aes» будут помещены в легенду, которая может быть действительно бесполезной.

Заключительное примечание . В этом примере вы могли бы достичь желаемого результата по-разному, но важно понять, как работают слои «ggplot2», чтобы максимально использовать ваши диаграммы «ggplot». Пока вы разделяете свои данные на разные слои, прежде чем вы вызываете функции «ggplot», у вас есть большой контроль над тем, как все будет отображаться на экране.

Он строится по строкам в файле data.frame. Попробуй это:

 df2 <- rbind(df[-50,],df[50,]) ggplot(df2) + geom_point(aes(x=x, y=y, color=label, size=size)) 

Как вы видите, зеленая точка рисуется последним, так как она представляет собой последнюю строку data.frame.

Вот способ упорядочения кадра data.frame:

 df2 <- df[order(-as.numeric(factor(df$label))),] 
  • Изменить кадр данных с тремя столбцами на матрицу («длинный» до «широкого» формата)
  • Обновить подмножество data.table на основе объединения
  • duplicate 'row.names' не допускается ошибка
  • Написание надежного R-кода: пространства имен, маскирование и использование оператора `::`
  • Извлечение уникальных чисел из строки в R
  • Почему я получаю «алгоритм не сходился» и «устанавливал prob численно 0 или 1» предупреждения с помощью glm?
  • Измените порядок дискретной шкалы x
  • Нумерация строк внутри групп в кадре данных
  • горизонтальная дендрограмма в R с метками
  • Вставить рисунок / таблицу в R Markdown
  • Как добавить новый столбец в фреймворк данных (на передний план не заканчивается)?
  • Давайте будем гением компьютера.