获取 ggplot2 图例以在 r 中显示百分比符号
Posted
技术标签:
【中文标题】获取 ggplot2 图例以在 r 中显示百分比符号【英文标题】:Get ggplot2 legend to display percentage sign in r 【发布时间】:2015-05-26 15:46:41 【问题描述】:以下是我正在尝试解决的问题的可重现示例。我在 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
ing 原始数据,然后加载 plyr 和 dplyr 和 reshape2 并重新整形为 GraphMelt
,然后绘图,只需使用 dput(GraphMelt)
这样您问题中的代码更简单,我们不必加载 3 个额外的包来运行您的代码。感谢您使事情可重现!
这是非常好的反馈,而且完全有意义。仍然试图在这里发帖的窍门,我试着只在我真的被卡住的时候问问题。我的下一篇文章会更好!
别担心!您已经在制作可重复的示例方面做得很好——挑战是在不删减太多的情况下将它们最小化。在这种情况下,这都是关于绘图显示选项的,因此不需要进行数据操作。但有时,了解更多过程很重要,例如那里是否存在潜在错误。
【参考方案1】:
加载 scales 包(您已经拥有它,但我想明确说明这种依赖关系)
library(scales)
并将labels = percent
添加到您的填充比例(如果您出于任何原因不想使用library(scales)
,请使用scales::percent
)。
scale_fill_gradient(low = "red", high = "green", limits = c(-8, 8), labels = percent)
【讨论】:
不敢相信这么简单。应该阅读更多有关尺度的文档。真的很有帮助的包。再次感谢您的建议。 我非常感谢这个答案,它解决了我在使用地图时遇到的两个问题。 对我来说labels = percent
不起作用。但是,labels = scales::percent
确实有效。为了谷歌员工,当我尝试labels = percent
时,它抛出了错误:Error in check_breaks_labels(breaks, labels) : object 'percent' not found
@BradTurek 是的,您要么需要按照您的评论执行scales::percent
,要么按照我的回答执行library(scales)
。我将进行编辑以使选择更清晰。
@GregorThomas,有趣的是,正如你所建议的,我的源代码中确实有 library(scales)
;但也许我忘了从一开始就运行我的源代码来实际使用它。感谢您的精彩回答!以上是关于获取 ggplot2 图例以在 r 中显示百分比符号的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化热力图(heatmap)自定义配置图例标签为百分比进行热力图颜色渐变显示(legend to display percentage sign)
在 ggplot2 中,如何将图例文本更改为百分比格式 [重复]
(R) 如何在 ggplot2 中根据颜色、线型和点形状获取图例?