Построить среднюю линию в facet_wrap

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть следующий набор данных:

 structure(list(Geschaeft = c(0.0961028525512254, 0.0753516756309475, 
0, 0.0722803347280335, 0, 0.000877706260971328), Gaststaette = c(0.0981116914423463, 
0.0789718659495242, 0.0336538461538462, 0.0905857740585774, 0, 
0.00175541252194266), Bank = c(0.100843712334271, 0.0717832023169218, 
0.00480769230769231, 0.025, 0.00571428571428572, 0.00965476887068461
), Hausarzt = c(0.0633989554037766, 0.0589573851882499, 0.0288461538461538, 
0.0217573221757322, 0.00685714285714286, 0.0128730251609128), 
    Einr..F..Aeltere = c(0.0337484933708317, 0.0550268928423666, 
    0.00480769230769231, 0, 0.00114285714285714, 0.000292568753657109
    ), Park = c(0.0738449176376055, 0.0726623913942904, 0.0625, 
    0.0846234309623431, 0.00228571428571429, 0.112053832650673
    ), Sportstaette = c(0.0449979911611089, 0.0612846503930492, 
    0.00480769230769231, 0.0619246861924686, 0.00114285714285714, 
    0), OEPNV = c(0.10847730012053, 0.089056681836988, 0.264423076923077, 
    0.135669456066946, 0, 0.185488589818607), Mangel.an.Gruenflaechen = c(0.0867818400964243, 
    0.071369466280513, 0.144230769230769, 0.117259414225941, 
    0.260571428571429, 0.186951433586893), Kriminalitaet = c(0.108316593009241, 
    0.083678113363674, 0.389423076923077, 0.139330543933054, 
    0.334857142857143, 0.216500877706261), Auslaender = c(0.00715146645239052, 
    0.0212039718659495, 0.0480769230769231, 0.0550209205020921, 
    0.0114285714285714, 0), Umweltbelastung = c(0.108879067898755, 
    0.0846607364501448, 0, 0.143828451882845, 0.376, 0.228203627852545
    ), Einr..f..Kinder = c(0.0693451185214946, 0.0825403392635499, 
    0.0144230769230769, 0.0527196652719665, 0, 0.0444704505558806
    ), Einr..f..Jugendliche = c(0, 0.0934526272238312, 0, 0, 
    0, 0.000877706260971328), count = c(1466, 1821, 81, 1491, 
    330, 793), cluster = c(1, 2, 3, 4, 5, 6)), .Names = c("Geschaeft", 
"Gaststaette", "Bank", "Hausarzt", "Einr..F..Aeltere", "Park", 
"Sportstaette", "OEPNV", "Mangel.an.Gruenflaechen", "Kriminalitaet", 
"Auslaender", "Umweltbelastung", "Einr..f..Kinder", "Einr..f..Jugendliche", 
"count", "cluster"), row.names = c(NA, -6L), class = "data.frame")
  

который я сортирую с

 mdf <- melt(nbhpp[,-15], id.vars = 'cluster')
mdf <- transform(mdf, variable = reorder(variable, value, mean), y = cluster)
  

и построить график с

 ggplot(mdf, aes(x=variable, y=value, group=cluster, colour=factor(cluster)))   
  geom_line()   
  scale_y_continuous('Anteile', formatter = "percent")  
  scale_colour_hue(name='Cluster')  
  xlab('Infrastrukturmerkmal')  
  theme_bw()  
  opts(axis.text.x = theme_text(angle=90, hjust=1), legend.position = "none")  
  facet_wrap(~cluster, ncol=3)
  

введите описание изображения здесь

Если я правильно понимаю, функция преобразования сортирует данные по средним значениям. Но как я могу включить эти средние значения в виде серой линии для каждого графика?

Спасибо за вашу помощь


Обновить:

Просто для пояснения:

Если я посмотрю на вывод инструкции reorder

 with(mdf, reorder(variable, value, mean))
  

чем я получаю следующие атрибуты:

 attr(,"scores")
   Einr..f..Jugendliche        Einr..F..Aeltere              Auslaender            Sportstaette 
             0.01572172              0.01583642              0.02381364              0.02902631 
               Hausarzt                    Bank               Geschaeft         Einr..f..Kinder 
             0.03211500              0.03630061              0.04076876              0.04391644 
            Gaststaette                    Park                   OEPNV Mangel.an.Gruenflaechen 
             0.05051310              0.06799505              0.13051918              0.14452739 
        Umweltbelastung           Kriminalitaet 
             0.15692865              0.21201772 
  

Которые сортируются на графике слева (самый низкий) направо (самый высокий).
Вопрос в том, как нарисовать линию с этими атрибутами…

Комментарии:

1. Для пояснения: вам нужна горизонтальная линия в каждой грани, которая указывает среднее значение для этой грани?

Ответ №1:

Отредактированный ответ

Чтобы добавить строку со средними по кластеру, вам нужно построить a data.frame , который содержит данные. Вы можете извлечь значения из mdf :

 meanscores <- attributes(mdf$variable)$scores
meandf <- data.frame(
  variable = rep(names(meanscores), 6),
  value    = rep(unname(meanscores), 6),
  cluster  = rep(1:6, each=14)
  )
  

Затем построить график с помощью geom_line :

 ggplot(mdf, aes(x=variable, y=value, group=cluster, colour=factor(cluster)))   
  geom_line()   
  scale_y_continuous('Anteile', formatter = "percent")  
  scale_colour_hue(name='Cluster')  
  xlab('Infrastrukturmerkmal')  
  theme_bw()  
  opts(axis.text.x = theme_text(angle=90, hjust=1), legend.position = "none")  
  facet_wrap(~cluster, ncol=3)  
  geom_line(data=meandf, aes(x=variable, y=value), colour="grey50")
  

введите описание изображения здесь


Оригинальный ответ

Моя первоначальная интерпретация заключалась в том, что вам нужна горизонтальная линия с общими значениями.

Просто добавьте geom_hline слой к своему графику и сопоставьте yintercept с mean(value) :

 ggplot(mdf, aes(x=variable, y=value, group=cluster, colour=factor(cluster)))   
  geom_line()   
  scale_y_continuous('Anteile', formatter = "percent")  
  scale_colour_hue(name='Cluster')  
  xlab('Infrastrukturmerkmal')  
  theme_bw()  
  opts(axis.text.x = theme_text(angle=90, hjust=1), legend.position = "none")  
  facet_wrap(~cluster, ncol=3)  
  geom_hline(aes(yintercept=mean(value)), colour="grey50")
  

введите описание изображения здесь

Комментарии:

1. Это не то, что я имел в виду… Но я уточнил выше

Ответ №2:

Создайте фрейм данных, содержащий средние значения для каждой группы. Есть много, много способов сделать это в R, например,

 means <- ddply(mdf, .(y), summarise, mean = mean(value))
  

(В этом случае кажется, что значение одинаково в каждом аспекте.)

Теперь нарисуйте, добавьте горизонтальную линию к вашему графику. Предполагая, что он был вызван ранее p ,

 p   geom_hline(aes(yintercept = mean), data = means)
  

Комментарии:

1. Это не то, что я имел в виду… Но я уточнил выше