【问题标题】:Plotting lines with multiple variables in ggplot在ggplot中绘制具有多个变量的线
【发布时间】:2015-04-23 11:56:39
【问题描述】:

我正在尝试使用 R 中的 ggplot2 根据 2 个变量绘制 2 条线。这是我正在使用的完整 Framingham 数据集中的一部分:

df2 = read.table(text = " number smoker   BMI   sex
98      No 27.73   Men
99      No 24.35   Men
100     No 25.60   Men
101    Yes 24.33   Men
102    Yes 27.54   Men
299     No 24.62 Women
300     No 31.02 Women
301    Yes 21.68 Women
302    Yes 19.66 Women
303    Yes 26.64 Women", sep = "", header = TRUE)

我在 ggplot 中尝试了以下操作,得到了一个我不想要的图表。

ggplot(df2, aes(smoker, BMI, color=sex)) + geom_line() + geom_point()

我希望有两条线路,一条用于男性,一条用于女性。我希望每个吸烟者类别中的点代表该性别组的平均值。

知道如何使用此数据集执行此操作吗?我在 stackoverflow 上找到了适用于其他数据集的示例。

【问题讨论】:

  • facet_grid 可能会有所帮助。

标签: r ggplot2 line


【解决方案1】:

您的图表图像有助于您了解您想要做什么。将 ddply 与 plyr 包中的汇总一起使用与 tapply 执行相同的计算,但在 ggplot 可以直接使用的数据框中返回结果。鉴于两个示例中使用了不同的数据,下面的代码似乎在 R 中重现了您的图表:

 library(plyr)
 df3 <- ddply(df2,.(sex, smoker), summarize, BMI_mean=mean(BMI))
 ggplot(df3,aes(as.numeric(smoker), BMI_mean, color=sex)) + geom_line() + 
       scale_x_discrete("Current Sig Smoker Y/N", labels=levels(df3$smoker)) +
       labs(y="Mean Body Mass Index (kg/(M*M)", color="SEX")

【讨论】:

  • 这太棒了!我看到 ddply 比使用 tapply 然后构建数据框更直接。非常感谢您的帮助!
【解决方案2】:

我找到了一种方法,但如果有人可以提供帮助,我仍在寻找更聪明的方法。

df3 <- with(df, tapply(BMI, list(smoker, sex), mean))
smoker <- c("No", "Yes", "No", "Yes")
sex <- c("Men", "Men", "Women", "Women")
BMI <- c(df3[1,1], df3[2,1], df3[1,2], df3[2,2])
df4 <- data.frame(smoker, sex, BMI)
ggplot(df4, aes(smoker, BMI, color=sex)) + geom_line(aes(group=sex)) + geom_point()

Correct R plot

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2013-12-25
    • 2015-03-16
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多