在R中使ggplot2图例显示百分号

21

下面是一个我正在尝试解决的问题的可复制示例。我已经在ggplot2中创建了一种热图,并且进展顺利。由于我在数据上放置了百分比符号以与geom_text一起使用,因此我希望使geom_tile的图例也显示百分比符号(我现在只能将实际值乘以100)。理想情况下,我希望右侧的图例栏显示8%,4%,0%,-4%,-8%。

#load in libraries
require(plyr)
require(dplyr)
require(reshape2)
require(ggplot2)
require(scales)

testDF <- structure(list(strategies = structure(c(8L, 7L, 6L, 5L, 4L, 3L, 
                                                  2L, 1L), .Label = c("Class 1", "Class 2", 
                                                                      "Class 3", "Class 4", "Class 5", "Class 6", 
                                                                      "Class 7", "Class 8"), class = "factor"), 
                         School1 = c(0.0355662887589396, 0.0316753241146625, 0.00606392341292672, 
                                     0.0250738342627283, -0.0405709181701368, 0.0237665074609996, 
                                     0.00587364885411765, -0.0343914002059331), School2 = c(NA, NA, 
                                                                                            NA, 0.0225535750673764, NA, -0.00448947685878404, NA, -0.0446386763157662
                                     ), School3 = c(NA, NA, NA, 0.0261099462365593, NA, 0.0199735626692146, 
                                                    NA, -0.0272279264519992), School4 = c(NA, NA, NA, 0.0164004151291513, 
                                                                                          NA, 0.00567638888888868, NA, -0.0384017249374949)), .Names = c("schools", 
                                                                                                                                                         "School1", "School2", "School3", "School4"), row.names = c(NA, -8L), class = "data.frame")


GraphMelt <- melt(testDF)
GraphMelt <- GraphMelt %>% mutate(text = sprintf("%1.2f%%", 100*value))
GraphMelt[,"text"] <- ifelse(GraphMelt[,"text"]=="NA%",NA,GraphMelt[,"text"])                                    
p <- ggplot(GraphMelt, aes(variable, schools))
p <- p + geom_tile(aes(fill = value*100), colour =   "white") + geom_text(aes(label=text),size=7)
p <- p + scale_fill_gradient(low = "red", high = "green",limits=c(-8,8))
p <- p + theme(
  axis.text.x= element_text(color="black", size=14, vjust=0.5),
  axis.text.y= element_text(color="black", size=14, vjust=0.5),
  axis.title.y = element_text(color="black",size=14, vjust=0.5),
  plot.title = element_text(color="black",size=14,face="bold", hjust=0.5,vjust=1),
  panel.background = element_blank(),
  legend.position="right",
  legend.title = element_blank(),
  legend.key = element_rect(fill="white"), legend.background = element_rect(fill=NA)
)
p <- p + xlab("") + ylab("") + ggtitle("Schools")

仅仅是一个建议---下次,建议你可以用 dput(GraphMelt) 代替将原始数据 dput 后再加载 plyr、dplyr、reshape2 来将数据重塑为 GraphMelt,然后绘图。这样做可以简化你的代码,并且我们不需要加载额外的三个软件包来运行你的代码。感谢你使得代码可复现! - Gregor Thomas
这是非常好的反馈,而且非常有道理。我仍在努力适应在这里发布内容,我只会在真正遇到困难时才提出问题。我的下一篇帖子会更好! - Trevor Nederlof
1
不用担心!你已经做得非常好了,制作可重现的示例——挑战在于使它们尽可能简洁,而不会削减太多内容。在这种情况下,关键是显示选项,因此数据操作并不必要。但有时候,看到更多的过程是很重要的,比如如果存在潜在的错误。 - Gregor Thomas
1个回答

34

加载称重包(您已经拥有它,但我想明确说明此依赖关系)

library(scales)

并将 labels = label_percent() 添加到您的填充比例尺中(或者如果您不想出于任何原因使用 library(scales),则可以使用 scales::label_percent())。

scale_fill_gradient(low = "red", high = "green", limits = c(-8, 8), labels = scales::label_percent())

1
简直不敢相信它是那么简单。应该更多地阅读有关比例尺的文档。这个包真的很有帮助。再次感谢您的建议。 - Trevor Nederlof
我非常感激这个答案,它解决了我在地图上遇到的两个问题。 - Andrew Brēza
1
对我来说,labels = percent 没有起作用。然而,labels = scales::percent 起了作用。为了方便谷歌搜索,当我尝试 labels = percent 时,它会抛出错误:Error in check_breaks_labels(breaks, labels) : object 'percent' not found - Brad Turek
2
请注意,percent()和percent_format()已被弃用,请改用label_percent()。 - Arthur Yip
1
补充@ArthurYip的回答 - scales::label_percent()必须作为一个函数调用,所以你的代码应该像这样:scale_fill_gradient2(labels = scales::label_percent()) - Dannid
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接