【问题标题】:How to combine line and bar chart for specific variable using R如何使用 R 为特定变量组合折线图和条形图
【发布时间】:2020-03-04 08:21:59
【问题描述】:

我有一个非常直截了当的问题。我会为 var1、var2、var3 和 var4 绘制条形图,为 var5 绘制折线图。线和条应该在同一个图表中。如何使用 ggplot 保持长格式?

set.seed(1984)
start_date <- as.Date('2015-01-01')  
end_date <- as.Date('2017-01-01')  

date_yq <- as.Date(sample( as.numeric(start_date): as.numeric(end_date), 50, 
                           replace = T), 
                   origin = '1970-01-01')
var1 <- runif(50)
var2 <- runif(50)
var3 <- runif(50)
var4 <- runif(50)
var5 <- var1+var2+var3+var4

country <- c("AT","AT","AT","BE","BE","CY","CY","CY","DE","DE")
country_r <- rep(country, times = 5)
df <- data.frame(date_yq, country_r, var1, var2,var3,var4,var5)
View(df)

df_m <- gather(df, key="variable", value="value", c("var1","var2","var3","var4","var5"))


ggplot(df_m, aes(x=date_yq, y=value, colour=variable)) +
  geom_line()+
  geom_bar(stat = "identity")+
  xlab("Date") + 
  ylab("Value")

编辑:经过一些调整,这是重现数据的代码:

 ggplot(data = df_m, aes(x = date_yq, y = value,fill=as.factor(variable))) +
  geom_bar(data = filter(df_m, variable != "var5"), stat = "identity", 
colour="black") + scale_fill_hue(c=45, l=80) +
  geom_line(data = filter(df_m, variable == "var5"), aes(col = variable, 
group = variable), colour="darkblue",size=1.3)

问题在于图例将 var5 显示为条形而不是单独的行。可能是什么问题?

【问题讨论】:

    标签: r ggplot2 bar-chart


    【解决方案1】:

    您可以在 geoms 中对数据进行子集化,例如

    ggplot(df_m) +
    geom_col(aes(x=date_yq, y=value, fill=variable), data=~filter(., variable != "var5")) +
    geom_line(aes(x=date_yq, y=value), colour="black", data=~filter(., variable == "var5")) +
    labs(x="Date", y="Value")
    

    提示:如果您预先计算了条形的高度,您只需使用 geom_col()。

    【讨论】:

    • 对不起,我的错误。在层 geom_line 也应该是 y=value。我更正了我的答案
    【解决方案2】:

    您需要指定不同的数据集来映射geom_linegeom_bar。这是一种方法:

    ggplot() +
      geom_col(data=df_m[df_m$variable != "var5",], aes(x=date_yq, y=value, fill=variable)) +
      geom_line(data=df_m[df_m$variable == "var5",], aes(x=date_yq, y=value, color=variable), lwd=1)+
      guides(fill = guide_legend(title = "Individuals")) +
      scale_color_manual(values = "darkblue", name="Grand Total") +
      xlab("Date") + 
      ylab("Value")
    

    使用的初始数据集是除“var5”之外的所有变量,然后在 geom_line 我定义了第二个数据集,它只是“var5”。
    此外,通过使用不同的美学,“填充”和“颜色”,我能够将图例分开。

    【讨论】:

    • 我调整了很好的答案并补充说:
    • 太好了,我还添加了:scale_color_manual(values = "darkblue"),但它只会改变线条的颜色(var 5),我已经找了好几个小时了,但我没有能够改变“个人”的调色板。你有什么想法吗?
    • @A_Bed,从上方使用scale_fill_manual(values = c("red", "blue", "green", "black"), name="Individuals") 而不是guides(fill = guide_legend(title = "Individuals"))
    • 谢谢,最后一件事。我正在尝试更改“var1”、“var2”、var3、var4 的颜色,因为正常颜色非常糟糕。我怎样才能做到这一点? scale_color_manual(values = c("darkblue","darkred"), name=c("Grand Total","var1")) 不起作用。
    • 查看我之前的评论。使用此行scale_fill_manual(values = c("red", "blue", "green", "black"), name="Individuals") 设置填充 颜色,然后使用:scale_color_manual(…) 设置行color 的颜色。
    【解决方案3】:

    此代码符合您的要求

    fig <- ggplot2:::ggplot(df_m, aes(x=date_yq, y=value, colour=variable)) +
      geom_line(data = subset(df_m, variable %in% c("var1", "var2", "var3", "var4"))) +
      geom_bar(data = subset(df_m, variable %in% c("var5")), stat = "identity") +
      xlab("Date") + 
      ylab("Value")
    

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多