Ответ 1
Ни один из встроенных позиций не делает этого, а geom_dotplot
не совсем прав, потому что он работает только в одном измерении. Я собрал новую позицию, которая делает правильные вещи, но требует ручной настройки, чтобы все было правильно.
library("proto")
PositionNudge <- proto(ggplot2:::Position, {
objname <- "nudge"
adjust <- function(., data) {
trans_x <- function(x) {
lx <- length(x)
if (lx > 1) {
x + .$width*(seq_len(lx) - ((lx+1)/2))
} else {
x
}
}
trans_y <- function(y) {
ly <- length(y)
if (ly > 1) {
y + .$height*(seq_len(ly) - ((ly+1)/2))
} else {
y
}
}
ddply(data, .(group), transform_position, trans_x=trans_x, trans_y=trans_y)
}
})
position_nudge <- function(width = 0, height = 0) {
PositionNudge$new(width = width, height = height)
}
Я назвал это подталкиванием, потому что другие вещи, которые я, хотя уже, были сделаны (стек, увернуться)
Чтобы использовать его
ggplot(example, aes(x, y)) +
geom_point(aes(group=interaction(x,y)), size=5,
position=position_nudge(height=0.03))
Вы также можете подталкивать в горизонтальном направлении
ggplot(example, aes(x, y)) +
geom_point(aes(group=interaction(x,y)), size=5,
position=position_nudge(width=0.03))
Вы должны указать взаимодействие группы как эстетическое с geom_point
, а точная ширина/высота, которые необходимо передать в position_nudge
, зависят от размера точек и размера вывода. Например, с выходом 4x6 вам нужно
ggplot(example, aes(x, y)) +
geom_point(aes(group=interaction(x,y)), size=10,
position=position_nudge(height=0.13))
Значение 0,13 было просто пробным и ошибочным, пока оно не выглядело правильно. Некоторые из кода и вещей, извлеченных из geom_dotplot
, вероятно, могут быть повторно использованы здесь, чтобы сделать это более надежным. Кроме того, я не тестировал это с любыми данными, отличными от приведенных example
, поэтому он может прервать его несколькими интересными способами. Но это, если не что иное, начало.