2015-02-09 93 views
0

编辑* 解决方案连接到这个问题锚文本注释

的底部我有一个注释,这将改变客户端到客户端的图形。我需要使用最大值对文本进行右对齐,以便任何客户端名称长度都不会覆盖图的其他区域。这里是代码和产品。只是希望文字总是在箭头旁边结束,然后向左长出。

x <- c(1,1,1,1,1,1,2,2,2,2,2,2) 
y <- c(0,0,0,0,0,0,0,0.33,0.17,0.16,0.14,0.2) 
z<-data.frame(cbind(x,y)) 
client.name = "x" 
client.year = 2015 

ggplot<- 
    ggplot(z,aes(x = x,y = y,fill = y))+ 
    geom_bar(stat = "identity", 
      fill = c("white","white","white","white","white","white", 
        "white","#c00000","#ed7d31","#ffc000","#92d050","#00b050"),width = .3)+ 
    theme(legend.position = "none") + 
    theme(axis.ticks = element_blank()) + 
    theme(panel.grid = element_blank()) + 
    theme(axis.title = element_blank()) + 
    theme(axis.text = element_blank()) + 
# theme(panel.background = element_blank()) + 
    theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))+ 
    geom_segment(aes(x = 1.77, y = .9, xend = 2.16, yend = .9),size=1.3, 
       arrow = arrow(angle = 20, length = unit(0.25, "inches"), ends = "first", type = "open"),linetype="solid")+ 
    annotate("text", x = 2, y = c(0.167,0.415,0.58,0.73,0.9), 
      label = c("Disparaging","Unhappy","Ambivalent","Happy","Delighted"), 
      colour="white", fontface="bold", size=10) + 
    annotate("text", x = 1, y =.9, label = paste(client.name,client.year,paste0(.9, "%")), 
      fontface = "bold", hjust=0, size=10) 
ggplot 

这里是一个具有悠久客户名称,手动调节的结果旁边的箭头

enter image description here

坐在这里是用尽可能小的客户端名称,“X”的结果。

enter image description here

我可以用值打每个名称获取文本的地方,我想它,但需要自动调整到最右边对箭头对于任何给定的域名(奖励积分,可以我甚至有很长的名字换行!?不知道如何)。

任何想法?

SOLUTION: 正如@baptiste指出的那样,hjust是这里的关键选项。我知道这是事实,但并不知道在0:1之外的hjust值会根据字符串长度改变锚点的位置。你可以看到我使用-1来获得正确的定位,当我应该有X操作。我通过将hjust设置为1(右对齐)并将X调整到所需的位置来解决了我的问题。

感谢您的期待。

+1

请确保您的代码运行时,有这么多的东西错了,现在 – rawr 2015-02-09 04:13:22

回答

1

如果你想右对齐文本,你应该使用hjust=1

lab = strwrap(paste(client.name,client.year,paste0(.9, "%")),10) 
annotate("text", x = 1.77, y =.9, label = paste(lab, collapse="\n"), 
     fontface = "bold", hjust=1, size=10) 
+0

感谢您的回复,我试图实现hjust调用(请参阅代码),问题在于文本的锚点随着字符串长度的移动而移动。我正试图设置正确的,有一个主播,想法?另外,你能向我描述一下吗?我认为hjust = 1应该将我的文本字符串设置在最后的绘图区域中,但实际上我必须设置大于0:1的值以将字符串移动到我需要的位置,即让x自动设置起始点右对齐的字符串。 – Alex 2015-02-11 02:02:51

+0

hjust = 1将右对齐文本,这意味着它延伸到x位置的左侧(此处为1.77,以匹配箭头的尖端)。 [0,1]之外的值总是令人困惑(通常最好避免),因为它们对应于字符串宽度IIRC的百分比。 – baptiste 2015-02-11 04:03:12

+0

结合您的最新评论,您的建议解决了我的问题。我会更新自己的帖子以显示答案,以及背后的推理对我的理解至关重要。 – Alex 2015-02-12 03:02:43

1

有趣的问题,这只是一个部分的解决方案。对于奖励积分问题,请尝试这种方法。

annotate("text", x = 1, y =.9, label = paste("verylong\nclientname", client.year,paste0(.9, "%")), fontface = "bold", hjust=0, size=10) 

enter image description here

如何以及在何处插入换行符\n算法比较复杂。您可能会说10个字符或更多是长客户名称。然后,也许你可以运行在每个客户端名称nchar(),并建立了一个测试沿着这个伪代码行:ifelse(NCHAR> 10,第11位插入断行,先不谈)

编辑关于安置客户名称,日期和百分比 现在你让我思考了!

为什么不定义anchor <- .9#使用箭头上的当前终点?

然后你把你的客户名称等与x = anchor - .1或左侧的一些水平调整?对于目前的MWE数据,其中x主要是1和2,这可能不太有效,但对于真实的数据,我认为这可能会使注释贴近箭头。

+0

所以,如果你有兴趣,我结束如果(nchar(client.name)> 40){warning(“Client name is too long”)} if(nchar(client.name)> 20)设置我的规则来打破字符串排列如下: if ){ space.locs = as.data.frame(str_locate_all(client.name,“”))#locate space space.mid = round(nrow(as.data.frame(space.locs ))/ 2)#找到中间空间 substr(client.name,space.locs [space.mid,1],space.locs [space.mid,1])< - “\ n”#add line break } ' – Alex 2015-02-12 10:47:27

+0

恭喜! – lawyeR 2015-02-12 11:02:13