Вопрос по r, ggplot2 – джиттер geom_line ()

17

Есть ли способ дрожать строки вgeom_line()? Я знаю, что это как бы бросает вызов цели этого сюжета, но если у вас есть сюжет с несколькими линиями и вы хотите, чтобы они все показали, это может быть удобно. Может быть, какое-то другое решение этого Видимость проблема.

Пожалуйста, см. Ниже для кода,

A  <- c(1,2,3,5,1)
B  <- c(3,4,1,2,3)
id <- 1:5
df <- data.frame(id, A, B)


# install.packages(reshape2)
require(reshape2) # for melt
dfm <- melt(df, id=c("id"))

# install.packages(ggplot2)
require(ggplot2)
p1 <- ggplot(data = dfm, aes(x = variable, y = value, group = id, 
color= as.factor(id))) + geom_line() + labs(x = "id # 1 is hardly 
visible as it is covered by id # 5") + scale_colour_manual(values = 
c('red','blue', 'green', 'yellow', 'black')) 


p2 <- ggplot(subset(dfm, id != 5), aes(x = variable, y = value, 
group = id, color= as.factor(id))) + geom_line() + labs(x = "id # 
5 removed, id # 1 is visible") + scale_colour_manual(values = 
c('red','blue', 'green', 'yellow', 'black')) 

# install.packages(RODBC)
require(gridExtra)

grid.arrange(p1, p2)

Ваш Ответ

3   ответа
13

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

Avoid ggplot2 lines overlapping exactly using position_dodge()

Пример кода:

df<-data.frame(x=1:10,y=1:10,z=1:10);
df.m <- melt(df, id.vars = "x");
ggplot(df.m, aes(x=x,y=value,group=variable,colour=variable)) 
    + geom_line(position=position_dodge(width=0.2));

Благодаряposition_dodge()Теперь мы можем видеть, что на графике есть две линии, которые точно совпадают:

prevent line overlap in ggplot with position_doge

@rumtscho спасибо за комментарий. Для тех, кто читает это, я только что подтвердил, что приведенный выше базовый пример (для линейных графиков) все еще работает в ggplot 2.2.1
Это было бы то, что мне нужно, но по какой-то причине это было сделано пока что. Сейчасposition_dodge занимает толькоwidth параметр безheight (версия 2.2.1), поэтому его нельзя использовать для различения горизонтальных полос в моем сюжете спагетти до обработки :( Еще +1 для вас, так как он кажется наиболее близким к ответу, который мне нужен.
4

так что, скажем, сплошная синяя линия «заглядывает через» пунктирная красная линия сверху. Опять же, это зависит от того, что вы хотите передать читателю. Имейте в виду, в первую очередь, чтоdata должны быть очки иtheory линии, если это не делает вещи загроможденными. Если вы неand значения х идентичны, точки будут легче увидеть. (или вы можете применить существующийjitter функция к значениям х)  Далее, если вы просто хотите показать, какие прогоны находятся в «комплекте». и которые являются выбросами, перекрытие не имеет значения, потому что очень маловероятно, что два выброса будут почти равны.

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

Мне нравится ваш аргумент, но я не уверен, как применить его к моему конкретному делу. Возможно ли предоставить вам пример кода или ссылки на некоторые визуальные примеры? Eric Fail
@EricFail: самый простой способ применения джиттера при построении точек - простоy_jit<-jitter(y_data) и / или то же самое дляx_data и затем передайте данные с перекосами в код вашего графика. Если вы хотите «дрожать» линии, я пойду с решением крещения.
23

geom_line(position=position_jitter(w=0.02, h=0))

и посмотрим, хорошо ли это работает.

Мне нравится это решение, я опробую его на моих реальных данных завтра (когда вернусь в лабораторию). Вы пробовали это с моим кодом? Eric Fail
рассмотреть такжеposition_dodge() чтобы избежать совпадения - смотрите мой ответ ниже
@babtiste, хорошая мысль. Eric Fail
да, но я думаю, что вы предпочитаете вертикальное или горизонтальное дрожание, зависит от ваших данных. Кроме того, может быть плохой идеей дрожать все, если вы хотите, чтобы дрожала только одна строка.

Похожие вопросы