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()
我从 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()