更改ggplot中的线宽,而不是大小

Ale*_*all 12 r ggplot2

我看到几篇关于改变 ggplot中线宽的帖子.答案虽然对OP有效且有效,但会改变线条大小.也就是说,ggplot似乎将线条视为一系列单位,并且尺寸增加了每个单元的长度和宽度,使得其他调整更粗糙.

我希望有一种方法可以使线条更宽(更厚)而不会影响长度,反过来又会影响破折号.

我从https://cran.r-project.org/web/packages/ggplot2/vignettes/ggplot2-specs.html借用了一些代码来说明我的意思:

library(ggplot2)

#A simple plot with manually set dashes.
#The first numeral is units of dash length, the second units in the gap in hexadecimal. 
lty <- c("11", "18", "1f", "81", "88", "8f", "f1", "f8", "ff")
linetypes <- data.frame(y = seq_along(lty), lty = lty) 

ggplot(linetypes, aes(0, y)) + 
  geom_segment(aes(xend = 5, yend = y, linetype = lty)) + 
  scale_linetype_identity() + 
  geom_text(aes(label = lty), hjust = 0, nudge_y = 0.2) +
  scale_x_continuous(NULL, breaks = NULL) + 
  scale_y_reverse(NULL, breaks = NULL)
Run Code Online (Sandbox Code Playgroud)

默认大小为虚线.

#Altering the size changes the line width AND dash spacing.

ggplot(linetypes, aes(0, y)) + 
  geom_segment(aes(xend = 5, yend = y, linetype = lty), 
     size = 3) + 
  scale_linetype_identity() + 
  geom_text(aes(label = lty), hjust = 0, nudge_y = 0.3) +
  scale_x_continuous(NULL, breaks = NULL) + 
  scale_y_reverse(NULL, breaks = NULL)
Run Code Online (Sandbox Code Playgroud)

大小为3的虚线.

基本上我想要的是粗线条,相对较薄和精细调整的间隙.我认为这是另一种问题:是否有一种方法可以使所有的线条,例如"虚线"在宽度上变化而不是在破折号的相对位置?像这样(我完全伪造):

线宽不同,但尺寸相同.

Z.L*_*Lin 10

来自?par“线型规范”的帮助文件(加粗以强调):

线型可以通过给一个小的内置线型表(1 = 实线,2 = 虚线等,见lty 上文)或直接作为线的开/关延伸的长度来指定。这是通过偶数(最多八个)字符的字符串完成的,即非零(十六进制)数字,它给出了字符串中连续位置的长度。例如,该字符串"33"指定三个单位开,然后三个关,并 "3313"指定三个单位开,三个关,然后一个开,最后三个关。这里的“单位”(在大多数设备上)与 成正比lwdlwd = 1以像素或点或 1/96 英寸为单位。

这表明,如果我们指定适当变化的线型和线宽(例如,较粗的线是较细线的两倍宽,开关拉伸的长度为一半),我们可以在不同的地方实现看似相同的虚线长度的预期效果。线宽。

注意:线型规范中允许的字符是c(1:9, "A":"F")),这意味着可能的最短拉伸长度为 1 个单位,最长为 15 个单位。这限制了可以创建的不同行的数量。

它与基本 R 绘图函数一起按预期工作:

plot.new()
plot.window(xlim=c(0, 5), ylim=c(1, 3))
abline(h = 3, lty = "22", lwd = 8)
abline(h = 2, lty = "44", lwd = 4)
abline(h = 1, lty = "88", lwd = 2)
axis(2, at = 3:1, labels=c("22", "44", "88"), tick = FALSE, las = 1)
Run Code Online (Sandbox Code Playgroud)

基数R

另一方面,对于 ggplot2,据我所知,图形文件设备的选择很重要。对于基于矢量的设备,破折号整齐地对齐,但对于基于位图的设备则不一定:

p <- ggplot(data.frame(y = seq(1, 3),
                       lty = c("11", "22", "44"),
                       lwd = c(8, 4, 2)), 
            aes(0, y)) + 
  geom_segment(aes(xend = 5, yend = y, 
                   linetype = lty,
                   lwd = lwd)) + 
  geom_text(aes(label = lty), hjust = 0, nudge_x = -0.3) +

  scale_linetype_identity() + 
  scale_size_identity() +
  scale_x_continuous(NULL, breaks = NULL) + 
  scale_y_reverse(NULL, breaks = NULL, expand = c(0.5, 0))

# bitmap devices
ggsave("test.bmp", p + ggtitle(".bmp"))
ggsave("test.jpg", p + ggtitle(".jpg"))
ggsave("test.png", p + ggtitle(".png"))
ggsave("test.tiff", p + ggtitle(".tiff"))
ggsave("test.wmf", p + ggtitle(".wmf"))

# vector devices
ggsave("test.eps", p + ggtitle(".eps"))
ggsave("test.pdf", p + ggtitle(".pdf"))
ggsave("test.svg", p + ggtitle(".svg"))
Run Code Online (Sandbox Code Playgroud)

不同设备的输出

我还没有在 ggplot2 中找到任何直接解决这个问题的内容。尽管如此,如果您需要一种位图格式,但等距短划线是重中之重,您可以先将您的绘图输出到基于矢量的设备之一,然后从一种文件格式转换为另一种文件格式。