提高ggplot2中geom_text输入的分辨率

19
任何关于如何提高geom_text的分辨率,使其与坐标轴标签的分辨率相当的建议?谢谢。
df <- data.frame("x" = c(1,2,3,4),"y" = c(15,19,35,47))

p<-ggplot(df,aes(x,y))
p<- p + geom_point(size=1)

p<- p + geom_smooth(method="lm", se=FALSE, formula=y~x)
p<- p + xlab("Better Resolution")
p<- p +ylab("Better Resolution")

p<- p +opts(axis.title.x = theme_text(family="Times",face="bold", size=25, colour = "Black",vjust=0)) 

p<- p +opts(axis.title.y = theme_text(family="Times",face="bold", size=25, angle =90, colour ="Black",vjust=0.4))

p<- p + geom_text(aes(x = 3.5, y = 37, label ="123456789"),size=12, parse = TRUE)
p

#The zoomed in text looks like this after saving using ggsave

enter image description here


这是一个包含图像的 HTML 段落。
#Information about my version of R and OS

sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

R.version
           _                            
platform       x86_64-apple-darwin9.8.0     
arch           x86_64                       
os             darwin9.8.0                  
system         x86_64, darwin9.8.0          
status                                      
major          2                            
minor          15.1                         
year           2012                         
month          06                           
day            22                           
svn rev        59600                        
language       R                            
version.string R version 2.15.1 (2012-06-22)
nickname       Roasted Marshmallows  

##############
#The actual code I am using looks like this:

#function that creates the line equation
lm_eqn = function(df){
m = lm(y ~ x, df)
eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
list(a = format(coef(m)[1], digits = 2),
b = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq))
}


#creates basic plot and adds a line
p<-ggplot(df, aes(x,y))
p<- p + geom_point(alpha=1/10, colour="blue", size=5)

#controls background colours
p<-p + theme_bw()

#adds the labels, titles and makes them pretty

p<- p + geom_smooth(method="lm", se=FALSE, formula=y~x,colour="black")
p<- p + xlab("Species similarity for site pair (Tsim variable 'a')")
p<- p +ylab("Trait similarity for site pairs (Tsim)")
p<- p +opts(title="Species vs. Trait combination similarity 2-5m")
p<- p +opts(plot.title = theme_text(family="Times",face="bold", size=18, colour =   "Black",vjust=1)) 
p<- p +opts(axis.title.x = theme_text(family="Times",face="bold", size=15, colour = "Black",vjust=0)) 
p<- p +opts(axis.title.y = theme_text(family="Times",face="bold", size=15, angle =90, colour =  "Black",vjust=0.4))

#adds the equation
p<- p + geom_text(aes(x = 0.015, y = 0.08, label = lm_eqn(df)),size=6,  family="Times",face="italic", parse = TRUE)

ggsave(p,file="tsim.a.0-2.pdf") 

4
你可能正在绘制多次相同的文本标签。尝试使用annotate代替,或者给最后一层提供数据。 - baptiste
当我绘制它们时,我没有看到它们之间有太大的区别。(而且我很确定他们没有多次绘制它,@baptiste) - joran
我也看不出任何区别,但操作系统可能会因为没有执行抗锯齿而导致这种情况。 - baptiste
谢谢您的关注!不过我必须与@joran不同意,分辨率明显更差。使用数字时可能更为突出。我正在使用geom_text添加描述线条的方程式,但它看起来很杂乱。我将把示例文本更改为数字,以便向您展示我的意思。 - Elizabeth
@baptiste 我使用的是Mac OS X 10.7.4版本。抗锯齿是什么意思?谢谢。 - Elizabeth
显示剩余3条评论
3个回答

15
为什么不使用保存屏幕绘图。在使用pdf或ps设备输出图形时,屏幕上看到的可能不一定是实际呈现的。我在Windows 7上使用R2.15.1和ggplot 0.9.1运行您未编辑过的代码时没有发现任何问题。我使用保存了您的屏幕绘图并进行了放大,pdf效果很好:

Zoom of geom_text rendering

使用ggsave(“plot.pdf”)(还有其他几个可选参数,包括保存为eps)。 这将默认情况下保存最后一个绘图到当前工作目录。检查绘图。如果文本仍然看起来很奇怪,我建议您的Times字体安装可能存在问题。

在这种情况下,您应该尝试省略字体规范,以便R选择其默认字体系列。

您还应该切换到theme而不是opts,并且切换到element_text而不是theme_text(目前!)。

**编辑**

好的,我认为我已经找到了您问题的解决方案here感谢kohskembask。显然,通过为标签创建数据框并将其传递给geom_text可以实现更好的结果。

请尝试使用:

df <- data.frame("x" = c(1,2,3,4),"y" = c(15,19,35,47))

lm_eqn = function(df){
m = lm(y ~ x, df)
eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
list(a = format(coef(m)[1], digits = 2),
b = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq))
}

### NEW ###
# Create a data frame to hold your label variables
data.label <- data.frame(
x = 0.015,
y = 0.08,
label = c(lm_eqn(df))
)

#creates basic plot and adds a line
p<-ggplot(df, aes(x,y))
p<- p + geom_point(alpha=1/10, colour="blue", size=5)

#controls background colours
p<-p + theme_bw()

#adds the labels, titles and makes them pretty

p<- p + geom_smooth(method="lm", se=FALSE, formula=y~x,colour="black")
p<- p + xlab("Species similarity for site pair (Tsim variable 'a')")
p<- p +ylab("Trait similarity for site pairs (Tsim)")
p<- p +opts(title="Species vs. Trait combination similarity 2-5m")
p<- p +opts(plot.title = theme_text(family="Times",face="bold", size=18, colour =   "Black",vjust=1)) 
p<- p +opts(axis.title.x = theme_text(family="Times",face="bold", size=15, colour = "Black",vjust=0)) 
p<- p +opts(axis.title.y = theme_text(family="Times",face="bold", size=15, angle =90, colour =  "Black",vjust=0.4))

### NEW
####   Change your call to geom_text ####
p<- p + geom_text(data = data.label, aes(x = x , y = y , label = label ) , size=6,  family="Times" , face="italic" , parse = TRUE)

ggsave(p,file="tsim.a.0-2.pdf") 

我在Mac OS X 10.7.4和R 2.15.1上遇到了这个问题:

Full size pdf

Zoom of equation annotation


感谢您的关注。我正在使用ggsave,但我的分辨率比您的截图要差得多。除了简化的示例之外,我在上面的问题中还包括了我实际使用的代码,以防代码中存在任何字体冲突?我的Times字体在轴标签和标题上看起来很好。只是通过geom_text添加的内容似乎分辨率较低。还有其他想法吗?感谢您的时间。 - Elizabeth
@Elizabeth,我现在可以看到你实际使用的代码是什么意思了。虽然我的屏幕输出看起来并不像你发布的那样糟糕,但确实有所不同!今晚我会试着玩一下,看看能否提供帮助。 - Simon O'Hanlon
@Simono101。你真是个明星!感谢你尝试着翻译它。 - Elizabeth
@Elizabeth 上面的建议有帮助吗? - Simon O'Hanlon
1
@Elizabeth 如果您对答案满意,请点击绿色的勾勾,这样我就能得到我的第一个被接受的答案了!谢谢。 - Simon O'Hanlon
显示剩余5条评论

3

单独在图表上注释时,请使用annotate()而不是geom_text()。否则,ggplot()将尝试为每个数据点绘制相同的文本,这会导致奇怪的分辨率。


这就是 OP 问题的实际解决方案。 - Paschalis

0
回应 @RonnieZavata 上面的答案(我认为这是针对这个问题的正确答案),geom_text 可能会导致 ggplot 在同一位置多次写入相同的文本,从而在输出中创建模糊的文本。然而,使用具有类似语法的 ggplot2::annotate(),可以只打印注释文本一次,使注释与图表中的其他文本一样清晰。
# load library
library(ggplot2)

# OP example up to adding text to plot
df <- data.frame("x" = c(1,2,3,4),"y" = c(15,19,35,47))

p <- ggplot(df, aes(x,y)) + 
  geom_point(size=1) +
  geom_smooth(method = "lm", se=FALSE, formula=y~x) + 
  xlab("Better Resolution") +
  ylab("Better Resolution")

# lousy resolution from geom_text

p + geom_text(aes(x = 3.5, y = 37, label ="123456789"),size=12, parse = TRUE)

# but fine resolution from `annotate()`
p + annotate("text", x = 3.5, y = 37, label ="123456789", size = 12)

有趣的是,在评论中,一些人指出这可能是特定于某个操作系统或PDF查看器的问题;虽然使用Rstudio的图形设备时,示例中的低分辨率对我来说显而易见但微妙,但在预览中查看使用pdf()创建的.pdf文件时,我遇到了@Elizabeth问题的一个相当极端版本,我的电脑是macOS 12.5


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