Как можно наложить линию на гистограмму, используя ggplot2? - PullRequest
11 голосов
/ 02 декабря 2010

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

Во-первых, мне нужно суммировать (суммировать) данные по группам, а во-вторых, я хотел бы преобразовать один из рядов (df2) в строку.

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,1,2,2,3,3))  
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,1,2))  
ggplot(df, aes(x=grp, y=val)) +   
    geom_bar(stat="identity", alpha=0.75) +  
    geom_bar(data=df2, aes(x=grp, y=val), stat="identity", position="dodge")

Ответы [ 2 ]

20 голосов
/ 02 декабря 2010

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

with(df, tapply(val, grp, sum))

Для простоты вы можете объединить линейчатые и линейные данные в один набор данных.

df_all <- data.frame(grp = factor(levels(df$grp)))
df_all$bar_heights <- with(df, tapply(val, grp, sum))
df_all$line_y <- with(df2, tapply(val, grp, sum))

Гистограммы используют категориальную ось X. Чтобы наложить линию, вам нужно преобразовать ось в числовую.

ggplot(df_all) +
   geom_bar(aes(x = grp, weight = bar_heights)) +
   geom_line(aes(x = as.numeric(grp), y = line_y))

enter image description here

13 голосов
/ 02 декабря 2010

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

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,2,3,1,2,3))
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,0,2))

p <- ggplot(df, aes(x=grp, y=val)) 
p <- p + geom_bar(stat="identity", alpha=0.75) 

p + geom_line(data=df2, aes(x=grp, y=val), colour="blue")

В качестве альтернативы, если приведенный выше пример данных верен, вы можете отобразить эту информацию как точку с помощью geom_point(data = df2, aes(x = grp, y = val), colour = "red", size = 6).Очевидно, вы можете изменить цвет и размер по своему вкусу.

РЕДАКТИРОВАТЬ: В ответ на комментарий

Я не совсем уверен, что должен выглядеть визуал для многочлена Freq над гистограммойлайк.Должны ли значения x быть связаны друг с другом?Во-вторых, вы продолжаете обращаться к нужным строкам, но ваш код показывает geom_bar(), что, как я полагаю, не то, что вы хотите?Если вы хотите строки, используйте geom_lines().Если два предположения выше верны, то вот подход для этого:

 #First let's summarise df2 by group
 df3 <- ddply(df2, .(grp), summarise, total = sum(val))
>  df3
  grp total
1   A     5
2   B     8
3   C     3

#Second, let's plot df3 as a line while treating the grp variable as numeric

p <- ggplot(df, aes(x=grp, y=val))
p <- p + geom_bar(alpha=0.75, stat = "identity") 
p + geom_line(data=df3, aes(x=as.numeric(grp), y=total), colour = "red")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...