编辑* 解决方案附在此问题的底部
我有一个带有注释的图表,可以将客户端更改为客户端。我需要使用最大值对文本进行右对齐,这样任何客户端名称长度都不会覆盖图形的其他区域。这是代码和产品。只是希望文本始终在箭头旁边结束,然后向左延伸。
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
这是带有长客户名称的结果,手动调整以坐在箭头旁边
这是具有最小可能客户名称的结果,&#34; x&#34;。
我可以通过播放每个名称的值来将文本显示到我想要的位置,但需要针对任何给定名称自动调整到最右边的箭头(奖励积分,我甚至可以换行很长的名字!?不知道如何)。
有什么想法吗?
解: 正如@baptiste指出的那样,hjust是这里的关键选择。我知道情况就是这样,但是我不知道在0:1之外的hjust值会改变锚点的位置作为字符串长度的函数。您可以看到我使用-1来获得正确的定位,当我应该操纵X.我通过将hjust设置为1(右对齐)并将X调整到所需位置来解决我的问题。
谢谢你的期待。
答案 0 :(得分:1)
有趣的问题,这只是部分解决方案。对于奖励积分问题,请尝试这种方法。
annotate("text", x = 1, y =.9, label = paste("verylong\nclientname", client.year,paste0(.9, "%")), fontface = "bold", hjust=0, size=10)
在算法上插入换行符\n
的方式和位置更复杂。您可能会说10个字符或更多是长客户端名称。然后,也许你可以在每个客户端名称上运行nchar()
并按照这个伪代码的行设置一个测试:ifelse(nchar&gt; 10,在第11位插入换行符,单独留下)
关于客户名称,日期和百分比的位置的编辑 现在你让我思考!
为什么不使用箭头上的当前终点来定义anchor <- .9
#?
然后您将您的客户名称等设置为x = anchor - .1
或左侧有一些水平调整?关于你当前的MWE数据,其中x大多是1和2,它可能不那么有效,但是对于真实数据,我认为这可能会将注释放在箭头的末端。
答案 1 :(得分: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)