2016-06-10 49 views
2

我的问题是关于这个问题。我想要在4年的时间里“2014”。我试图重复,但我的代码并没有给我想要的。添加文本到多面条形图的绘图

Annotating text on individual facet in 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轴) 。 enter image description here

新的代码注释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")后。请查看我的代码和数据格式有什么问题。谢谢。

+0

将'ann_text $ Rot.Herb = NA'添加到您的注释数据框中。即使你没有在'geom_text'中使用该列,ggplot希望它在那里,如果该列用于主要调用ggplot中的美学。 – eipi10

+0

谢谢你的帮助。你的意思是'ann_text < - data.frame(x =“S4-conv”,y = 1.75,lab =“2014”, Rot = factor(“4-year”,levels = c(“2-year” “3年”,“4年”)),ann_text $ Rot.Herb = NA)?我做到了这一点,并得到新的错误'在eval(expr,envir,enclos)中的错误:找不到对象的'值' –

+0

这是因为你也在你的初始ggplot调用中使用列'值'。所以你需要在你的新数据框中添加'ann_text $ value = NA'。在你最初的ggplot调用中使用的每一列也需要在你稍后介绍的任何数据框中。 – eipi10

回答

1

原来的问题是,当你有value=NAann_text它被解释为逻辑(而不是数字,这是其在Shannon.long2模式),从而导致错误,因为ggplot预计的数值变量,而不是绝对的。在ann_text中设置value=NA_real_(除NA之外,R具有类别特定的缺失值常量;有关详细信息,请参见?NA),以确保value被解释为数字并解决错误。或者将value设置为任意数字,例如value=0

在下面的例子中,我删除了所有的themelab报表向下缩短代码要领:

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)) 

请注意,您还需要养活xygeom_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)) 
+0

非常感谢您花时间调查问题。我真的很感激。 –

+0

我最终使用了这套代码 '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 =因子(“2年”,levels = c(“2年”,“3年”,“4年”)) )) p + geom_text(data = ann_text,aes(label = lab,x,y),size = 8)' –