【问题标题】:How do I get exact font, line, point and figure sizes in ggplot2?如何在 ggplot2 中获得准确的字体、线条、点和图形大小?
【发布时间】:2016-11-14 17:53:34
【问题描述】:

对于最终提交的文章,我被要求更新我的数据,以使其符合以下规范:

  1. 轴线为 0.25 毫米
  2. 周围有刻度线的轴线
  3. 数据线为0.5毫米
  4. 字体为 10pt
  5. 数字应为 80 或 169 毫米宽
  6. 必须为 300 dpi

我尝试过的:

library(ggplot2)
library(cowplot)
theme_set(theme_bw())

x <- rnorm(100)
mydata <- data.frame(x = x,
                     y = x^2 + runif(100),
                     z = rep(letters[1:4], 25))

p <- ggplot(data = mydata, aes(x, y)) + 
  geom_point(aes(color = z)) + 
  geom_smooth(color = 'black', se = FALSE, size = 0.5) +
  theme(text = element_text(family = 'Times', size = 10, color = 'black'),
        axis.ticks.length = unit(-0.1, 'cm'),
        axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')),
        axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')),
        panel.grid = element_blank(),
        axis.line = element_line(size = 0.25),
        legend.position = c(0.5, 0.75))

p
ggsave(plot = p, 
       filename = 'myplot.png', 
       width = 80, height = 50, dpi = 300, units = 'mm')

p2 <- cowplot::plot_grid(plotlist = list(p, p, p, p), nrow = 1)
ggsave(plot = p2,
       filename = 'mymultipleplot.png',
       width = 169, height = 50, dpi = 300, units = 'mm')

返回以下两个图:

我可以弄清楚如何处理这里的一些问题(例如图例位置),但在以下方面遇到困难:

  1. 如何获取顶部和右侧坐标轴周围的刻度?
  2. 我怎样才能得到正确的尺寸...
    • 这些看起来比 10 pt 大得多。 (下载它们或在新窗口中打开以查看未缩放的版本)
    • 尽管在主题(字体、线条)中指定了大小,但两个图形中的大小并未保持不变。
    • 我不知道如何确认线条的大小是否正确(以磅或毫米为单位)...ggsave 会自行缩放吗?

更新对于我目前的任务,我导出为 svg 文件并在 Inkscape 中编辑它们。这花了几个小时,但比让 ggplot 符合规范要容易。

但是,知道将来如何在 ggplot2 中以编程方式执行此操作会很有帮助。

【问题讨论】:

  • 对于问题 1(如何在顶部和右侧坐标轴上获得刻度?),请参阅 ggplot 2.2.0scale_ 中的新 sec.axis 参数。尝试例如ggplot(mpg, aes(displ, hwy)) + geom_point() + scale_x_continuous(sec.axis = dup_axis()) + scale_y_continuous(sec.axis = dup_axis()).
  • 在我看来,轴标签“x”和“y”刚好适合 10 pt,而所有其他文本都更小。在 300 dpi (ppi) 的分辨率下,10 pt 是 10 / 72 * 300 像素或大约 42 像素。
  • 您应该更具体地说明两个图中未保留的尺寸是什么意思。两个图中的线宽和字体大小似乎相同。
  • 也许这有帮助:moc.online.uni-marburg.de/gitbooks/publicationQualityGraphics/… 这是我几年前写的,所以情况可能已经发生了变化,但可能仍有有用的提示。

标签: r graphics ggplot2


【解决方案1】:

问题的答案: 1) 正如 Henrik 在 cmets 中所说:

对于问题 1(如何在顶部和右侧坐标轴上获得刻度?),请参阅 ggplot 2.2.0 中 scale_ 中的新 sec.axis 参数。尝试例如ggplot(mpg, aes(displ, hwy)) + geom_point() + scale_x_continuous(sec.axis = dup_axis()) + scale_y_continuous(sec.axis = dup_axis())

2)这里的问题是您具有不同尺寸的相同分辨率。由于两个图形的高度相同,您可以通过手动将字体大小乘以宽度的比率来解决此问题:例如

theme(text = element_text(family = 'Times', size = 10*(80/169), color = 'black')

整个代码应该是这样的:

library(ggplot2)
library(cowplot)
theme_set(theme_bw())

x <- rnorm(100)
mydata <- data.frame(x = x,
                     y = x^2 + runif(100),
                     z = rep(letters[1:4], 25))

p1 <- ggplot(data = mydata, aes(x, y)) + 
  geom_point(aes(color = z)) + scale_x_continuous(sec.axis = dup_axis()) + 
  scale_y_continuous(sec.axis = dup_axis()) + 
  geom_smooth(color = 'black', se = FALSE, size = 0.5) +
  theme(text = element_text(family = 'Times', size = 10*(80/169), color = 'black'),
        axis.ticks.length = unit(-0.1, 'cm'),
        axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')),


        axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')),

        panel.grid = element_blank(),
        axis.line = element_line(size = 0.25),
        legend.position = c(0.5, 0.75))

p2 <- ggplot(data = mydata, aes(x, y)) + 
  geom_point(aes(color = z)) + scale_x_continuous(sec.axis = dup_axis()) + 
  scale_y_continuous(sec.axis = dup_axis()) + 
  geom_smooth(color = 'black', se = FALSE, size = 0.5) +
  theme(text = element_text(family = 'Times', size = 10, color = 'black'),
        axis.ticks.length = unit(-0.1, 'cm'),
        axis.text.x = element_text(margin = margin(t = 4, unit = 'mm')),


        axis.text.y = element_text(margin = margin(r = 4, unit = 'mm')),

        panel.grid = element_blank(),
        axis.line = element_line(size = 0.25),
        legend.position = c(0.5, 0.75))


p1
ggsave(plot = p1, 
       filename = 'myplot.png', 
       width = 80, height = 50, dpi = 300, units = 'mm')

p2multi <- cowplot::plot_grid(plotlist = list(p2, p2, p2, p2), nrow = 1)

ggsave(plot = p2multi ,
       filename = 'mymultipleplot.png',
       width = 169, height = 50, dpi = 300, units = 'mm')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多