Добавление текста на график с фасетной гистограммой

Мой вопрос связан с этим вопросом. Хочу «2014» в 4-х годичном фаске. Я пытался повторить, но мой код не дает того, что я хочу.

Аннотирование текста на отдельном фасете в ggplot2

Это мои данные

structure(list(Rot = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("2-year", 
"3-year", "4-year"), class = "factor"), Rot.Herb = structure(c(3L, 
3L, 4L, 4L, 13L, 13L, 14L, 14L, 5L, 5L, 6L, 6L, 9L, 9L, 10L, 
10L, 15L, 15L, 16L, 16L, 1L, 1L, 2L, 2L, 7L, 7L, 8L, 8L, 11L, 
11L, 12L, 12L, 17L, 17L, 18L, 18L), .Label = c("A4-conv", "A4-low", 
"C2-conv", "C2-low", "C3-conv", "C3-low", "C4-conv", "C4-low", 
"O3-conv", "O3-low", "O4-conv", "O4-low", "S2-conv", "S2-low", 
"S3-conv", "S3-low", "S4-conv", "S4-low"), class = "factor"), 
    variable = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("Diversity", 
    "Evenness"), class = "factor"), N = c(4, 4, 4, 4, 4, 4, 4, 
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4), value = c(0.78537789925, 0.613408315, 
    1.305194686, 0.79519430975, 0.4481728555, 0.30608817425, 
    1.20978861475, 0.8580643725, 0.92387324875, 0.630166121, 
    0.945954185, 0.561172324, 1.43952456275, 0.8616864655, 1.23679146725, 
    0.831737624, 1.033474108, 0.80689293925, 0.9910142125, 0.79342098075, 
    1.175512223, 0.6293940245, 0.981614832, 0.62342189825, 1.351710013, 
    0.805075937, 1.6598348325, 0.7983622545, 1.01606920875, 0.5751418795, 
    1.0500365255, 0.56408326225, 1.07162937725, 0.6756859865, 
    0.45699816625, 0.44444147325), sd = c(0.354077266902404, 
    0.208934910331856, 0.169501822767995, 0.0774319459391732, 
    0.737366460962239, 0.40697977697835, 0.494107033311986, 0.11906912863268, 
    0.491492768082854, 0.34236657107712, 0.219739438843007, 0.205905593411204, 
    0.319301583035043, 0.0696484379979274, 0.0563293598951725, 
    0.0978700910274188, 0.446850757364563, 0.175073468716825, 
    0.426859848850874, 0.180469101499932, 0.526842123835502, 
    0.200470277385505, 0.574885944755375, 0.27189545397305, 0.39621771945215, 
    0.150798258847229, 0.275863362594154, 0.111178397407429, 
    0.254811233135664, 0.158920851982914, 0.198698241334475, 
    0.0730606635175717, 0.717706309307313, 0.453776579066358, 
    0.574276936403411, 0.513758415496589), se = c(0.177038633451202, 
    0.104467455165928, 0.0847509113839974, 0.0387159729695866, 
    0.368683230481119, 0.203489888489175, 0.247053516655993, 
    0.0595345643163399, 0.245746384041427, 0.17118328553856, 
    0.109869719421504, 0.102952796705602, 0.159650791517521, 
    0.0348242189989637, 0.0281646799475863, 0.0489350455137094, 
    0.223425378682282, 0.0875367343584126, 0.213429924425437, 
    0.090234550749966, 0.263421061917751, 0.100235138692753, 
    0.287442972377688, 0.135947726986525, 0.198108859726075, 
    0.0753991294236146, 0.137931681297077, 0.0555891987037145, 
    0.127405616567832, 0.0794604259914568, 0.0993491206672376, 
    0.0365303317587859, 0.358853154653656, 0.226888289533179, 
    0.287138468201705, 0.256879207748294), ci = c(0.563415944919255, 
    0.332462066715199, 0.26971522480343, 0.123211505132525, 1.1733145846647, 
    0.647595643784969, 0.786234551289211, 0.189465554245211, 
    0.782074671929471, 0.544781614588516, 0.349654482635521, 
    0.327641747494367, 0.508080071600555, 0.110826207087643, 
    0.089632581638694, 0.155733154793995, 0.71103927089404, 0.278580956835532, 
    0.679229274424713, 0.287166612643164, 0.838323385234058, 
    0.318992946792351, 0.914771825423139, 0.432646341459985, 
    0.630470808679215, 0.23995368085579, 0.438960169525453, 0.176909640028318, 
    0.40546153371869, 0.252878539112781, 0.316173242000635, 0.116255819336536, 
    1.14203089616693, 0.722059798737006, 0.91380275723334, 0.817504285602766
    )), .Names = c("Rot", "Rot.Herb", "variable", "N", "value", 
"sd", "se", "ci"), row.names = c(NA, -36L), class = "data.frame")

и код для построения графика

p <- ggplot(Shannon.long2, aes(x=Rot.Herb, y=value, fill=factor(variable)))+
  geom_bar(stat="identity", position="dodge")+
  scale_fill_brewer(palette = "Set1")+
  theme_bw() +
  theme(panel.grid.major=element_blank()) +
  facet_grid(~Rot, scales = "free_x", space="free_x")+
  theme(legend.title=element_blank(),legend.text=element_text(size=20),legend.position="top")+
  geom_errorbar(aes(ymin=value-se, ymax=value+se), size=0.5, width=.25,position=position_dodge(.9))+
  xlab("\nTreatment") +
  theme(axis.title = element_text(size=24,face="bold", vjust=4), axis.text.x = element_text(size=20,angle = 90, hjust = 1)) +
  ylab("Shannon's H' and E'") +
  theme(axis.title = element_text(size=24,face="bold", vjust=2), axis.text.y = element_text(size=20, color="black"))+
  theme(strip.text.x = element_text(colour = "black", size = 20), strip.background = element_rect(fill = "white"))

построенный график (пожалуйста, не обращайте внимания на «2014» на оси Y). введите описание изображения здесь

Новый код для аннотирования 2014 г. с помощью eipi10

 ann_text <- data.frame(x = "S4-conv",y = 1.75,lab = "2014", Rot.Herb=NA, 
value=NA, variable=NA, 
N=NA, sd=NA, se=NA, ci=NA, 
Rot = factor("4-year",levels = c("2-year","3-year","4-year")))

Я получил сообщение об ошибке Error: Discrete value supplied to continuous scale после запуска p + geom_text(data = ann_text,label = "2014"). Пожалуйста, посмотрите, что не так с моим кодом и форматом данных. Спасибо.


person Little Bee    schedule 10.06.2016    source источник
comment
Добавьте ann_text$Rot.Herb=NA во фрейм данных аннотации. Даже если вы не используете этот столбец в geom_text, ggplot ожидает, что он будет там, если этот столбец используется для эстетики в основном вызове ggplot.   -  person eipi10    schedule 10.06.2016
comment
Спасибо за помощь. Возможно, вы имели в виду ann_text <- data.frame(x = "S4-conv",y = 1.75,lab = "2014", Rot = factor("4-year",levels = c("2-year","3-year","4-year")), ann_text$Rot.Herb=NA)? I did that and got new error Error в eval (expr, envir, enclos): object 'value' not found`   -  person Little Bee    schedule 10.06.2016
comment
Это потому, что вы также используете столбец value в исходном вызове ggplot. Так что вам нужно также добавить ann_text$value=NA в ваш новый фрейм данных. Каждый столбец, который используется в вашем первоначальном вызове ggplot, также должен быть во всех фреймах данных, которые вы вводите в график позже.   -  person eipi10    schedule 10.06.2016
comment
Мне жаль. Я еще не смог это сделать. Это мой полностью отредактированный код со всеми именами столбцов в Shannon.long2: ann_text <- data.frame(x = "S4-conv",y = 1.75,lab = "2014", Rot.Herb=NA, value=NA, variable=NA, N=NA, sd=NA, se=NA, ci=NA, Rot = factor("4-year",levels = c("2-year","3-year","4-year"))). Я получил новую ошибку Error: Discrete value supplied to continuous scale, но все же преобразовал Rot в фактор.   -  person Little Bee    schedule 10.06.2016
comment
Я снова открыл вопрос, ожидая решения, происходит ли что-то еще, помимо проблемы, которую я уже поднял. А пока возьмите код из своего комментария и добавьте его в качестве обновления к своему вопросу.   -  person eipi10    schedule 10.06.2016


Ответы (1)


Оказывается, проблема в том, что когда вы включаете value=NA в ann_text, он интерпретируется как логический (а не числовой, который является его режимом в Shannon.long2), вызывая ошибку, потому что ggplot ожидает числовую переменную, а не категориальную. Установите value=NA_real_ (в дополнение к NA, R имеет специфичные для класса константы отсутствующих значений; дополнительную информацию см. В ?NA) в ann_text, чтобы гарантировать, что value интерпретируется как числовое, и устранить ошибку. Или установите value на любое число, например, value=0.

В приведенном ниже примере я удалил все операторы theme и lab, чтобы сократить код до самого необходимого:

p = ggplot(Shannon.long2, aes(x=Rot.Herb, y=value, fill=factor(variable))) +
  geom_bar(stat="identity", position="dodge") +
  geom_errorbar(aes(ymin=value-se, ymax=value+se), size=0.5, width=.25,position=position_dodge(.9)) +
  facet_grid(~Rot, scales = "free_x", space="free_x")

ann_text <- data.frame(x = "S4-conv", y = 1.75, lab = "2014", Rot.Herb=NA, 
                       value=NA_real_, variable=NA)

p + geom_text(data = ann_text, aes(label=lab, x, y))

Обратите внимание, что вам также необходимо передать значения x и y в geom_text, чтобы указать местоположение метки.

Другой вариант - просто использовать те же имена переменных x и y, что и в исходном фрейме данных, поскольку ggplot уже знает эти имена и масштабировал график на их основе. Теперь единственный недостающий столбец, который нам нужно добавить, - это variable:

ann_text <- data.frame(Rot.Herb = "S4-conv", value = 1.75, lab = "2014", variable=NA)

p + geom_text(data = ann_text, aes(label=lab, Rot.Herb, value))
person eipi10    schedule 10.06.2016
comment
Большое спасибо за то, что уделили время исследованию проблемы. Я действительно ценю. - person Little Bee; 11.06.2016
comment
В итоге я использовал этот набор кода ann_text <- data.frame(x= "C2-low", y = 1.75,lab = "2014", variable=NA_real_, Rot.Herb=NA, value=0, N=0, sd=0, se=0, ci=0, Rot = factor("2-year",levels = c("2-year","3-year","4-year"))) p + geom_text(data = ann_text, aes(label=lab, x, y), size=8) - person Little Bee; 11.06.2016