سؤال

أنا أستخدم ggplot2 لإنشاء لوحات من الرسوم البيانية، وأود أن أكون قادرًا على إضافة خط عمودي في متوسط ​​كل مجموعة.لكن Geom_vline() يستخدم نفس التقاطع لكل لوحة (أي.المتوسط ​​العالمي):

require("ggplot2")
# setup some sample data
N <- 1000
cat1 <- sample(c("a","b","c"), N, replace=T)
cat2 <- sample(c("x","y","z"), N, replace=T)
val <- rnorm(N) + as.numeric(factor(cat1)) + as.numeric(factor(cat2))
df <- data.frame(cat1, cat2, val)

# draws a single histogram with vline at mean
qplot(val, data=df, geom="histogram", binwidth=0.2) + 
  geom_vline(xintercept=mean(val), color="red")

# draws panel of histograms with vlines at global mean
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + 
  geom_vline(xintercept=mean(val), color="red")

كيف يمكنني جعلها تستخدم مجموعة كل لوحة كتقاطع x؟(نقاط إضافية إذا كان بإمكانك أيضًا إضافة تسمية نصية بجانب السطر الذي يحتوي على قيمة المتوسط.)

هل كانت مفيدة؟

المحلول

إحدى الطرق هي إنشاء إطار البيانات باستخدام القيم المتوسطة مسبقًا.

library(reshape)
dfs <- recast(data.frame(cat1, cat2, val), cat1+cat2~variable, fun.aggregate=mean)
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + geom_vline(data=dfs, aes(xintercept=val), colour="red") + geom_text(data=dfs, aes(x=val+1, y=1, label=round(val,1)), size=4, colour="red")

نصائح أخرى

أعتقد أن هذه إعادة صياغة لـ @eduardo حقًا، ولكن في سطر واحد.

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
  + geom_vline(data=aggregate(df[3], df[c(1,2)], mean), 
      mapping=aes(xintercept=val), color="red") 
  + facet_grid(cat1~cat2)

نص بديل http://www.imagechicken.com/uploads/1264782634003683000.png

أو باستخدام plyr (require(plyr) حزمة من مؤلف ggplot، هادلي):

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
  + geom_vline(data=ddply(df, cat1~cat2, numcolwise(mean)), 
      mapping=aes(xintercept=val), color="red") 
  + facet_grid(cat1~cat2)

يبدو من غير المرضي عدم قطع الخط vline على الجوانب، ولست متأكدًا من السبب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top