2015-10-22 2 views
1

Я хочу комбинировать линию и гистограмму с тремя различными переменными, используя ggplot. Гистограмма должна иметь значения сверху и должна быть заполнена теми же цветами, что и строки в приведенной выше таблице. Вот мой кодНесколько строк и гистограмм в ggplot с geom_text и цветами

# First some data generation 
df.x = data.frame(date = Sys.Date()-20:1, 
        value = c(1:20), 
        variable = "line", 
        object = "x") 

df.y = data.frame(date = Sys.Date()-20:1, 
        value = c(1:20)*2, 
        variable = "line", 
        object = "y") 

df.z = data.frame(date = Sys.Date()-20:1, 
        value = c(1:20)*3, 
        variable = "line", 
        object = "z") 

df.y.bar = data.frame(date = Sys.Date()-10, 
        value = 30, 
        variable = "bar", 
        object = "y") 

df.x.bar = data.frame(date = Sys.Date()-10, 
         value = 40, 
         variable = "bar", 
         object = "x") 

df.z.bar = data.frame(date = Sys.Date()-10, 
         value = 50, 
         variable = "bar", 
         object = "z") 

df = rbind(df.x, df.y,df.z, df.x.bar, df.y.bar,df.z.bar) 

my.cols = c("blue", "green", "yellow") 

# Pass everything to ggplot 
ggplot(df, aes_string(x = "date", y = "value", fill="variable")) + 
    facet_grid(variable~., scales="free_y") + 
    geom_line(data = subset(df, variable == "line"), aes(colour = factor(object)), size = 1, show_guide = FALSE, stat="identity") + 
    geom_bar(data = subset(df, variable == "bar"), aes(colour = factor(object)), show_guide = TRUE, stat="identity", position = "dodge") + 
    geom_text(data = subset(df, variable == "bar"), aes(y=value+0.7 * sign(value), ymax=value, label=round(value, 2)), position = position_dodge(width = 0.9), size=3) + 
    scale_colour_manual(values = my.cols) 

Получившийся участок не совсем то, что я хотел. Я использовал position_dodge(width = 0.9), но текст над столбцами не перемещается. Ирретически это не происходит, когда я выбрал только две переменные (например, x и y), которые должны быть включены в фрейм данных. Желаемый результат должен выглядеть следующим образом:

enter image description here

Спасибо большое за помощь!

+0

Был мой ответ полезным? – beetroot

+0

Привет, свекла. Он работает с вашими данными. Я попробовал это на своем наборе данных, и раскраска баров работала отлично. К сожалению, текст над барами по-прежнему не перемещается, даже если я применяю группу Argument ... – Pat

+0

Странно, можете ли вы опубликовать некоторые данные и код для воспроизведения текстовой проблемы? – beetroot

ответ

2

Вы можете заполнить бруски, выбрав fill = factor(object) и добавив scale_fill_manual(values = my.cols). Чтобы иметь только одну легенду, я думаю, что удаление fill="variable" от aes_string сделал трюк в сочетании с scale_fill_manual. И уворачиваясь текст, который нужно добавить group аргумент и position = position_dodge(width=1)

ggplot(df, aes_string(x = "date", y = "value")) + 
      facet_grid(variable~., scales="free_y") + 
      geom_line(data = subset(df, variable == "line"), aes(colour = factor(object)), size = 1, show_guide = FALSE, stat="identity") + 
      geom_bar(data = subset(df, variable == "bar"), aes(fill = factor(object)), show_guide = TRUE, stat="identity", position = "dodge") + 
      geom_text(data =subset(df, variable == "bar"), aes(x=date, y=(value+0.7) * sign(value), ymax=value, label=round(value, 2), group=object), position = position_dodge(width=1), size=3) + 
      scale_colour_manual(values = my.cols) + 
      scale_fill_manual(values = my.cols) 

enter image description here