【问题标题】:Icons as x-axis labels in R - ggplot2图标作为 R 中的 x 轴标签 - ggplot2
【发布时间】:2015-04-29 09:22:59
【问题描述】:

(这是问题Icons as x-axis labels in R 的扩展。它寻找ggplot 解决方案而不是plot 解决方案。因为ggplot 基于gridplot是基于graphics的,做法很不一样)

我想绘制类似(from this paper) 的图,其中图标(在本例中为小图)用作刻度标签。

原始问题接受的答案是:

library(igraph)    
npoints <- 15
y <- rexp(npoints)
x <- seq(npoints)

# reserve some extra space on bottom margin (outer margin)
par(oma=c(3,0,0,0))
plot(y, xlab=NA, xaxt='n',  pch=15, cex=2, col="red")
lines(y, col='red', lwd=2)

# graph numbers 
x = 1:npoints   

# add offset to first graph for centering
x[1] = x[1] + 0.4
x1 = grconvertX(x=x-0.4, from = 'user', to = 'ndc')
x2 = grconvertX(x=x+0.4, from = 'user', to = 'ndc')

for(i in x){  

  print(paste(i, x1[i], x2[i], sep='; '))

  # remove plot margins (mar) around igraphs, so they appear bigger and 
  # `figure margins too large' error is avoided
  par(fig=c(x1[i],x2[i],0,0.2), new=TRUE, mar=c(0,0,0,0))
  plot(graph.ring(i), vertex.label=NA)  
}

我们如何使用 ggplot 制作类似的情节?

这是离我最近的地方:

library(ggplot2)
library(grImport)
library(igraph)

npoints <- 5
y <- rexp(npoints)
x <- seq(npoints)

pics  <- vector(mode="list", length=npoints)
for(i in 1:npoints){
  fileps <- paste0("motif",i,".ps")
  filexml <- paste0("motif",i,".xml")

  # Postscript file
  postscript(file = fileps, fonts=c("serif", "Palatino"))
  plot(graph.ring(i), vertex.label.family="serif", edge.label.family="Palatino")
  dev.off()

  # Convert to xml accessible for symbolsGrob
  PostScriptTrace(fileps, filexml)
  pics[i] <- readPicture(filexml)
}
xpos <- -0.20+x/npoints
my_g <- do.call("grobTree", Map(symbolsGrob, pics, x=xpos, y=0))
qplot(x, y, geom = c("line", "point")) + annotation_custom(my_g, xmin=-Inf, xmax=Inf, ymax=0.4, ymin=0.3)

【问题讨论】:

  • 一点也不!这个要求 ggplot 解决方案。
  • 三:a)利用ggplot的能力(易用性、功能等)在近期进一步完善剧情。 (b) 我在代码的其他部分使用 ggplot (同质性) (c) 有趣和好奇。
  • 这是您要找的吗? stackoverflow.com/questions/8905101/…
  • @hrbrmstr 另请注意,使用 opts(axis.text.x = my_axis()) 已弃用
  • @hrbrmstr 您链接的解决方案对于ggplot2的最新版本根本不起作用

标签: r ggplot2


【解决方案1】:

这是您尝试的基础。

(我在rexp函数之前使用了set.seed(1),还调整了图形以增加边缘厚度:plot(graph.ring(i), vertex.label=NA, edge.width=30)

从上面继续:

# Initial plot
p <- qplot(x, y, geom = c("line", "point")) 

# Use the plot to get the x-positions of the labels
g <- ggplotGrob(p)    
xpos <- g$grobs[[grep("axis-b", g$layout$name)]]$children[[2]]$grobs[[2]]$x

# Create grob tree 
my_g <- do.call("grobTree", Map(symbolsGrob, pics, x=xpos, y=0.5))

# Make second plot
# Add extra space under the plot for the images 
# Remove x-axis details
# Note the annotation is below the lower y-axis limit
# The limits were selected by inspection
p2 <- p + annotation_custom(my_g, xmin=-Inf, xmax=Inf, ymax=-0.1, ymin=-0.2) + 
            theme(axis.text.x = element_blank(), 
                  plot.margin=unit(c(1,1,2,1), "cm"))

# remove clipping so the images render
g <- ggplotGrob(p2)
g$layout$clip[g$layout$name=="panel"] <- "off"

grid.newpage()
grid.draw(g)

将有一种方法可以正确/符合以前可爱的解决方案,但无论如何......

【讨论】:

  • 使用 ggplot2 版本 3.0.0,您现在可以使用 my_plot + coord_cartesian(clip = 'off') 禁用剪辑,这比网格解决方案(即 g$layout$clip[g$layout$name=="panel"] &lt;- "off")更简单
  • @bschneidr ;如果有更好的方法,或者 grob 路径损坏等,请随时更新答案
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多