首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测标签是否超出ggplot2打印中的打印区域?

问如何检测标签是否超出ggplot2打印中的打印区域?
EN

Stack Overflow用户
提问于 2016-01-22 02:50:26
回答 1查看 1.4K关注 0票数 4

我有一些经常用来生成大批量条形图的代码。条形图通过x轴上的标签进行聚集,然后每个单独的条形图在条形图的顶部都有一个标签。有时,单个条形图标签的文本超出绘图区的顶部并被截断--这取决于x轴标签的长度、单个条形图标签的长度以及条形图本身的高度。

我可以手动调整每个绘图的scale_y_continuous(limits=c(0,100))以使其看起来更美观。例如,如果一个条形的高度达到100%,但是有一个非常长的标签,我可以使用:scale_y_continuous(limits=c(0,140),breaks=c(0,25,50,75,100))。这会使y轴刻度线停止在100%处,但会在绘图区的顶部为我的标签留出额外的空间。如果条形只有40%,并且标签很短,那么将y限制留在c(0,140)上看起来很糟糕,因为在100%的标记上有太多的空格。

因为我制作了大量这样的图,所以我想要一种自动确定如何为每个图设置scale_y_continuous限制的方法。手工操作太耗时了。

有没有一种方法可以测试标签是被截断还是在绘图区之外运行?如果是这样的话,我可以通过测试看看标签是否被截断,然后稍微扩展y限制,直到没有截断,从而迭代到一个漂亮的图。

EN

回答 1

Stack Overflow用户

发布于 2016-01-22 04:18:14

我不认为这是可以做到的。我认为这归根结底是因为你没有完全理解ggplot2所基于的语法。具体地说,ggplot如何从数据值映射到美学价值。

这可以通过一个简单的思维实验来直观地理解:

代码语言:javascript
复制
library(ggplot2)
data(mtcars)
p <- ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars)))
# consider
p + geom_text()
# vs 
p + geom_text(size= 15)

第一个绘图p + geom_text()和第二个p + geom_text(size=15)之间的区别是什么?从数据(结构)的角度来看,它们是相同的。唯一的区别是用于从数据元素映射到美学的缩放。但我的理解是,从数据元素到像素元素的映射不会存储;因此您无法查看结果位置。

通过检查ggplot对象的结构,这一预感似乎很清楚:

代码语言:javascript
复制
p2 <- p + geom_text()
str(p2)
List of 9
 $ data       :'data.frame':    32 obs. of  11 variables:
  ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
  ..$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
  ..$ disp: num [1:32] 160 160 108 258 360 ...
  ..$ hp  : num [1:32] 110 110 93 110 175 105 245 62 95 123 ...
  ..$ drat: num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
  ..$ wt  : num [1:32] 2.62 2.88 2.32 3.21 3.44 ...
  ..$ qsec: num [1:32] 16.5 17 18.6 19.4 17 ...
  ..$ vs  : num [1:32] 0 0 1 1 0 1 0 1 1 1 ...
  ..$ am  : num [1:32] 1 1 1 0 0 0 0 0 0 0 ...
  ..$ gear: num [1:32] 4 4 4 3 3 3 3 4 4 4 ...
  ..$ carb: num [1:32] 4 4 1 1 2 1 4 2 2 4 ...
 $ layers     :List of 2
  ..$ :Classes 'proto', 'environment' <environment: 0x0000000015eb15f8> 
  ..$ :Classes 'proto', 'environment' <environment: 0x0000000015f6d0a0> 
 $ scales     :Reference class 'Scales' [package "ggplot2"] with 1 field
  ..$ scales: list()
  ..and 23 methods, of which 9 are  possibly relevant:
  ..  add, clone, find, get_scales, has_scale, initialize, input, n, non_position_scales
 $ mapping    :List of 3
  ..$ x    : symbol wt
  ..$ y    : symbol mpg
  ..$ label: language rownames(mtcars)
 $ theme      : list()
 $ coordinates:List of 1
  ..$ limits:List of 2
  .. ..$ x: NULL
  .. ..$ y: NULL
  ..- attr(*, "class")= chr [1:2] "cartesian" "coord"
 $ facet      :List of 1
  ..$ shrink: logi TRUE
  ..- attr(*, "class")= chr [1:2] "null" "facet"
 $ plot_env   :<environment: R_GlobalEnv> 
 $ labels     :List of 3
  ..$ x    : chr "wt"
  ..$ y    : chr "mpg"
  ..$ label: chr "rownames(mtcars)"
 - attr(*, "class")= chr [1:2] "gg" "ggplot"

正如您所看到的,没有存储各种几何对象(本例中为文本)的坐标像素位置。我猜这是因为ggplot2是交互式使用的,但这只是一种猜测。也就是说,您可以很容易地更改绘图。保存绘图的唯一原因是通过ggsave或某个grDevices函数(png等),在这种情况下,图形会保存到文件中。

如果你查看Hadley关于ggplot的书中的图3.7,这是图形生成过程的示意性表示,似乎存储从数据元素到像素位置的映射不是保存的,而是每次生成的。

..。如果有人对ggplot的内部工作原理有更深的理解/已经检查过源代码,那么请插话,我将更新或删除我的答案。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34931967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档