ggplot2 geom_path 情节非常 "fuzzy." 我该如何解决这个问题?

ggplot2 geom_path plot is very "fuzzy." How can I fix this?

我从 ggplot 看到一些非常奇怪(和不受欢迎的)行为。我正在使用以下代码生成沿单个路径具有不同颜色段的图。

library(data.table)
library(ggplot2)

testData = fread("test_data.tsv")

ggplot(testData, aes(X, Y, color = Color, group = 1)) +
  geom_path(size = 1.5) + scale_color_identity()

(“test_data.tsv”内的数据可以在this pastebin处找到。)

结果图如下所示:

如您所见,边缘非常模糊(或模糊、参差不齐,或随便你怎么称呼它们),我似乎无法修复它们。我试过以更高的 dpi 或其他图形格式(如 pdf)导出,但没有任何效果。

有趣的是,放大模糊部分似乎可以让我们深入了解正在发生的事情:

每个点似乎都对齐以连接到它的邻居,但实际连接一点也不顺利。我假设这是使用“group = 1”参数来防止 ggplot 将所有类似颜色的区域连接在一起的产物。但是,正是出于这个原因,我无法更改该选项。

是否有我可以实施的解决此问题的方法,或者我只是 运行 目前 ggplot 的限制?

这与拥有如此多的数据点和一条(相对)粗线有关 - 所以您的绘图代码没有问题。如果您使用较小的 size 值检查数据,您不会看到“模糊”的外观,但更难将细线可视化:

ggplot(testData, aes(X, Y, color = Color, group=1)) +
  geom_path(size=0.5) + scale_color_identity()

解决方法是使用 geom_path() 中的 lineend=... 参数来平滑连接点的地方。在将行大小设置为非常大(例如,大于 1)之前,这根本不会产生太大影响。默认值是 lineend="butt" ,它会在该点处绘制一条硬边。您要在此处使用的选项是 lineend="round",它提供圆边。这是它的样子:

ggplot(testData, aes(X, Y, color = Color, group=1)) +
  geom_path(size=1.5, lineend = "round") + scale_color_identity()

其工作原理的详细视图

为了更好地了解其工作原理,让我们以下面显示的示例数据集为例。首先,这是使用默认值 (lineend="butt") 时的图:

set.seed(8675309)
df <- data.frame(x=1:20, y=sample(-50:50, size=20, replace=T), col = sample(LETTERS[1:2], size=20, replace=T))

ggplot(df, aes(x,y, color=col, group=1)) +
  geom_path(size=5, lineend="butt", alpha=0.8, show.legend = FALSE) +
  theme_light()

设置 lineend="round" 时的不同之处在于:

ggplot(df, aes(x,y, color=col, group=1)) +
  geom_path(size=5, lineend="round", alpha=0.8, show.legend = FALSE) +
  theme_light()