在ggplot中绘制具有多个变量的行

时间:2015-02-21 22:25:50

标签: r ggplot2 line

我试图在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上找到了与其他数据集一起使用的示例。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

图表中的图片对理解您要做的事情有很大帮助。使用带有plyr包的汇总的ddply执行与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")

enter image description here