2016-11-14 11 views
1

У меня есть набор данных, который выглядит следующим образом:ggplot2 Multiple непрерывной переменной черчения

Distance Mean SD Median VI Vegetation.Index  Direction X X.1 X.2 X.3 
1  10m 0.525 0.082 0.530 NDVI    NDVI Whole Landscape NA NA NA NA 
2  25m 0.517 0.085 0.523 NDVI    NDVI Whole Landscape NA NA NA NA 
3  50m 0.509 0.086 0.514 NDVI    NDVI Whole Landscape NA NA NA NA 
4  100m 0.494 0.090 0.497 NDVI    NDVI Whole Landscape NA NA NA NA 
5  10m 0.545 0.076 0.551 NDVIe    NDVI   East NA NA NA NA 
6  25m 0.542 0.078 0.549 NDVIe    NDVI   East NA NA NA NA 


> dput(droplevels(head(data))) 
structure(list(Distance = structure(c(2L, 3L, 4L, 1L, 2L, 3L), .Label = c("100m", 
"10m", "25m", "50m"), class = "factor"), Mean = c(0.525, 0.517, 
0.509, 0.494, 0.545, 0.542), SD = c(0.082, 0.085, 0.086, 0.09, 
0.076, 0.078), Median = c(0.53, 0.523, 0.514, 0.497, 0.551, 0.549 
), VI = structure(c(1L, 1L, 1L, 1L, 2L, 2L), .Label = c("NDVI", 
"NDVIe"), class = "factor"), Vegetation.Index = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = "NDVI", class = "factor"), Direction = structure(c(2L, 
2L, 2L, 2L, 1L, 1L), .Label = c("East", "Whole Landscape"), class = "factor"), 
X = c(NA, NA, NA, NA, NA, NA), X.1 = c(NA, NA, NA, NA, NA, 
NA), X.2 = c(NA, NA, NA, NA, NA, NA), X.3 = c(NA, NA, NA, 
NA, NA, NA)), .Names = c("Distance", "Mean", "SD", "Median", 
"VI", "Vegetation.Index", "Direction", "X", "X.1", "X.2", "X.3" 
), row.names = c(NA, 6L), class = "data.frame") 

Я хотел бы создать barplot фасетов сетку с категориальной переменной по оси Х (Distance), непрерывной переменной на ось y (индекс растительности) и две полосы (средние и средние значения индекса вегетации) для каждого барплота. Граница штриховых рисунков называется «Направление» и «Индекс растительности».

Я сделал это с одним типом меры (в среднем), изображенным ниже.

enter image description here

Вот код, у меня сейчас:

p = ggplot(data,aes(x=Distance,y=Mean,fill=Distance)) + geom_bar(stat = 
    'identity',position='dodge')+ facet_grid(Direction~Vegetation.Index)+ 
    coord_cartesian(ylim=c(0.2,0.95)) + geom_errorbar(data = data, 
    aes(ymin=Mean-SD,ymax=Mean+SD),width=0.5) 

Но я также хочу планку медианы рядом с ним.

Like this, но для всех штриховых площадок в сетке фасет.

Я нашел некоторые темы, людей, которые хотят, чтобы сделать это точно или нечто подобное, и нашел, что они довольно полезны:

This

Or this

Однако мои данные выглядит очень отличается от их (Я думаю) и меняя его каким-либо образом испортил то, что у меня уже есть. Из того, что я понимаю, я должен использовать group = 'Mean + Median'.

+2

Пожалуйста, сделайте [воспроизводимый пример (нажмите для многих подсказок)] (http://stackoverflow.com/q/5963269/903061). Не разделяйте изображения данных. Вместо этого (а) используйте встроенные данные, которые выглядят как ваши данные, (б) обмениваются коротким кодом для имитации выборочных данных или (c) используйте 'dput()', чтобы воспроизводить ваши данные (или, может быть, подмножество ваших данных) , – Gregor

+0

Также, пожалуйста, будьте понятнее о желаемом выходе. «многократные непрерывные переменные вдоль оси х» не имеет большого смысла, особенно для барплота. Ось оси штрихового графика является категоричной, а не непрерывной. Вы имеете в виду, что вы хотите * тип меры * вдоль оси x, например, один бар для медианного, один бар для среднего? – Gregor

+0

С разъяснением, похоже, что ваша первая ссылка вопроса является почти точным дубликатом. Вам нужно будет преобразовать ваши данные ** в длинный формат **, где у вас есть один столбец «* measure *», который принимает значения «или» означает «или» «медианный» и один столбец «* значение *» который принимает числовые значения среднего или медиана. Вы можете использовать 'melt' [как в этом ответе] (http://stackoverflow.com/a/30023982/903061), чтобы сделать это. – Gregor

ответ

2

Используя ваши данные образца, мы сначала преобразуем его в длинный формат. Здесь я использую tidyr::gather, но reshape2::melt (или data.table::melt) работают аналогично.

library(tidyr) 
dfl = gather(df, key = measure, value = value, Mean, Median) 

dodge_width = 0.8 
ggplot(dfl, 
     aes(x = measure, y = value, fill = Distance, group = Distance)) + 
    geom_bar(stat = 'identity', 
      position = position_dodge(dodge_width), 
      width = dodge_width) + 
    facet_grid(Direction ~ Vegetation.Index) + 
    coord_cartesian(ylim = c(0.2, 0.95)) + 
    geom_errorbar(
     aes(ymin = value - SD, ymax = value + SD), 
     width=0.5, 
     position = position_dodge(dodge_width) 
    ) 

enter image description here

+0

Удивительно. Вы были чрезвычайно полезны. Спасибо огромное! это также точно указывало, где моя попытка пошла не так. Я довольно новичок в R, поэтому синтаксис в настоящее время немного громоздкий. Еще раз спасибо!! –

+1

Рад, что вы нашли это полезным! Если вы планируете использовать 'ggplot' много, я настоятельно рекомендую прочитать [Документ Tidy Data] (http://vita.had.co.nz/papers/tidy-data.pdf) - 95% новых попыток пользователя с 'ggplot' получают данные в правильном формате, и аккуратная бумага данных помогает описать цели. И в следующий раз, когда вы зададите вопрос о SO, вы будете знать, что данные можно воспроизводить с самого начала :) – Gregor

+0

Я обязательно дам, что прочитал! То же самое касается обмена данными. Еще раз спасибо! –