r-为ggsave中的最终绘图计算给定尺寸的面板大小(显示geom_dotplot的计数)



我试图在x轴上显示点图的计数,如下所示:显示点图在x轴上的计数

library(ggplot2)
library(grid)
date = seq(as.Date("2016/1/5"), as.Date("2016/1/12"), "day")
value = c(11,11,12,12,13,14,14,14)
dat =data.frame(date = date, value = value)
### base plot
g <- ggplot(dat, aes(x = value)) + geom_dotplot(binwidth = 0.8) + coord_flip()
g  # output to read parameter
### calculation of width and height of panel
current.vpTree()
seekViewport('panel.3-4-3-4')
real_width <- convertWidth(unit(1,'npc'), 'inch', TRUE)
real_height <- convertHeight(unit(1,'npc'), 'inch', TRUE)
### calculation of other values
height_coordinate_range <-diff(ggplot_build(g)$layout$panel_params[[1]]$y.range)
real_binwidth <- real_height / height_coordinate_range * 0.8  # 0.8 is the argument binwidth
num_balls <- real_width / 1.1 / real_binwidth  # the number of stacked balls. 1.1 is expanding value.
g + ylim(0, num_balls) 

然而,在我看来,real_width指的是面板的宽度,而不是整个图。当我使用时,这会导致计数刻度和点之间的错位

ggsave(g, 
filename = "g.png", 
path = getwd(),
device = "png",
height = real_height,
width = real_width,
units = "cm")

如果我想要一个6cm x 6cm的图,我如何找到面板的尺寸,以便使用面板尺寸来计算num_balls

这个故事的寓意是:在绘制情节之前,你无法准确地知道面板的大小。但是,您可以通过从输出维度减去打印装饰的维度来近似它。这种方法忽略了在现实中,图形设备可能具有影响文本真实大小的"分辨率"/"缩放"参数。这里的理由是,由于面板是"空"单元,在减去每个非空单元后,它们会适应输出维度的剩余部分。

library(ggplot2)
library(grid)
dat =data.frame(
date = seq(as.Date("2016/1/5"), as.Date("2016/1/12"), "day"), 
value = c(11,11,12,12,13,14,14,14)
)
g <- ggplot(dat, aes(x = value)) + geom_dotplot(binwidth = 0.8) + coord_flip()
output_width <- unit(6, "cm")
output_height <- unit(6, "cm")
# Convert plot to gtable
gt <- ggplotGrob(g)
# Find panel
is_panel <- grep("panel", gt$layout$name)
panel_location <- gt$layout[is_panel,]
# Note: panel width / heights are 'null' units
gt$widths[panel_location$l]
#> [1] 1null
gt$heights[panel_location$t]
#> [1] 1null
# Get widths/heights of everything except the panel
width  <- gt$widths[-panel_location$l]
height <- gt$heights[-panel_location$t]
# Calculate as output size - size of plot decoration
panel_height <- output_height - sum(height)
panel_width  <- output_width - sum(width)
convertUnit(panel_height, "cm")
#> [1] 4.6283951674277cm
convertUnit(panel_width, "cm")
#> [1] 4.57547850076103cm

创建于2022-02-24由reprex包(v2.0.1(

有一些方法可以固定面板的尺寸,这会让事情变得更容易,但这不是问题所在。

最新更新