ggplot2 geom_path 图非常“模糊”。我怎样才能解决这个问题?

b.m*_*ton 0 r blurry ggplot2

我从 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()
Run Code Online (Sandbox Code Playgroud)

(“test_data.tsv”中的数据可以在此 Pastebin中找到。)

结果图如下所示: 模糊图

正如你所看到的,边缘非常模糊(或者模糊,或者锯齿状,或者无论你想怎么称呼它们),我似乎无法修复它们。我尝试过以更高的 dpi 或其他图形格式(例如 pdf)导出,但没有任何效果。

有趣的是,放大模糊部分似乎可以洞察正在发生的事情: 模糊变焦

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

是否有我可以实施的解决此问题的方法,或者我此时是否遇到了 ggplot 的限制?

che*_*123 6

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

ggplot(testData, aes(X, Y, color = Color, group=1)) +
  geom_path(size=0.5) + scale_color_identity()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

解决方法是使用lineend=...参数 ingeom_path()来平滑点连接的位置。直到线尺寸设置得相当大(例如,大于 1)之前,这根本没有太大影响。默认值是lineend="butt"在该点绘制硬边。您要在此处使用的选项是lineend="round"提供圆角边缘的选项。它看起来是这样的:

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

在此输入图像描述

详细了解其工作原理

为了更好地了解其工作原理,我们来看一个如下所示的示例数据集。首先,这是使用默认值 ( ) 时的绘图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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在您设置时的区别如下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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述