【问题标题】:How to use categorical variable to color geom_path如何使用分类变量为 geom_path 着色
【发布时间】:2018-07-25 15:57:24
【问题描述】:

我有一个问题可能有一个简单的答案,但我想不通。我正在使用 ggplot2 制作图形,特别是 geom_path()。路径根据分类变量intersects 着色,如果路径穿过某个多边形,则其值为 TRUE,否则为 FALSE(我指定 group=1,因此路径不按变量分组)。

它几乎按照我的意愿工作,只是颜色应用于以下路径段而不是前面的段。例如,如果观察 i = TRUE,并且 i + 1 = FALSE,则结果路径在位置 i、i+1 之间的颜色为 TRUE;在位置 i+1、i+2 之间为 FALSE。 我希望位置 i-1, i 之间的路径为 TRUE,而 i, i+1 为 FALSE。

# Create polygon.
boundary_x <- c(640343.419, 640341.452, 640339.242, 640337.471, 640339.538, 640341.603)
boundary_y <- c(4858742.348, 4858733.404, 4858722.512, 4858722.853, 4858732.737, 4858742.649)
boundary <- data.frame(x = boundary_x, y = boundary_y)

# Sample data
x <- c(640338.007929366, 640338.077929366, 640338.857929366, 640338.867929366, 640338.459933366, 640338.407929366, 640338.174617366, 640338.139168366, 640338.070599366, 640337.747929366, 640337.847929366, 640338.439430366, 640338.777929366, 640338.877929366, 640339.444178366, 640339.557929366, 640340.247929366, 640340.927929366, 640340.977929366, 640341.107929366, 640341.157929366, 640341.427929366, 640341.477929366, 640341.807929366, 640341.847929366, 640342.427929366, 640342.642404366, 640342.867436366, 640342.878517366, 640343.116330366, 640343.097929366, 640343.007929366, 640342.387929366, 640341.929667366, 640341.837929366, 640339.927929366, 640339.847929366, 640336.427929366, 640335.717929366, 640335.057929366, 640334.967929366, 640334.681813366, 640334.208384366, 640334.172648366, 640334.417929366, 640334.587929366, 640334.777929366, 640334.987929366, 640334.925775366, 640338.257929366, 640338.187929366, 640338.057929366, 640338.077929366, 640338.077929366, 640340.200274366, 640341.037929366, 640341.114123366, 640341.187929366, 640341.237929366)
y <- c(4858731.28088173, 4858731.24088173, 4858730.80088173, 4858730.79088173, 4858728.57674273, 4858728.30088173, 4858727.05816773, 4858726.86768973, 4858726.36255673, 4858722.41088173, 4858722.03088173, 4858721.55321173, 4858721.29088173, 4858721.27088173, 4858721.16125073, 4858721.13088173, 4858721.06088173, 4858720.89088173, 4858720.90088173, 4858720.86088173, 4858720.85088173, 4858720.83088173, 4858720.84088173, 4858721.10088173, 4858721.14088173, 4858722.17088173, 4858722.50853873, 4858722.94242373, 4858722.98987973, 4858725.39572673, 4858725.44088173, 4858725.57088173, 4858725.69088173, 4858725.44266973, 4858725.40088173, 4858721.90088173, 4858721.81088173, 4858721.76088173, 4858721.93088173, 4858722.11088173, 4858722.18088173, 4858722.67533273, 4858723.32189973, 4858723.40558473, 4858727.23088173, 4858727.71088173, 4858728.14088173, 4858728.61088173, 4858730.42873273, 4858728.23088173, 4858727.62088173, 4858726.41088173, 4858726.32088173, 4858726.32088173, 4858726.02508273, 4858726.13088173, 4858726.13140073, 4858726.19088173, 4858726.23088173)
intersects <- c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)
df <- data.frame(x = x, y = y, intersects = intersects)

# Plot
ggplot() + 
  geom_polygon(data = boundary, aes(x, y)) + 
  geom_path(data = df, aes(x, y, col = intersects, group = 1)) + 
  geom_point(data = df, aes(x, y, col = intersects)) + 
  coord_cartesian(xlim = c(640334, 640343), ylim = c(4858721, 4858731)) 

当您查看绘图时,您会看到蓝色线段代表 intersects = TRUE,它们出现在路径穿过多边形之后。可以这么说,我想将颜色向后移动,因此实际穿过多边形的线段是彩色的。

我是新来的,没有足够的声誉来发布图片..抱歉!

【问题讨论】:

  • 请提供您的代码。
  • 添加了一些示例代码。

标签: r ggplot2


【解决方案1】:

这里的问题是您将颜色(通过intersects 列)分配给点,而不是实际带有颜色的线。 ggplot2 将每个点视为一条线的起点,然后将其着色,而您将它们视为要着色的线的终点。

当然,您可以更改您对列 intersection 的定义,以配合 ggplot2 处理这种情况的方式。或者,您可以在使用 dplyr 包中的 lead() 创建绘图时修改列:

ggplot() + 
  geom_polygon(data = boundary, aes(x, y)) + 
  geom_path(data = df, aes(x, y, col = dplyr::lead(intersects, default = FALSE), group = 1)) + 
  geom_point(data = df, aes(x, y, col = intersects)) + 
  coord_cartesian(xlim = c(640334, 640343), ylim = c(4858721, 4858731)) +
  labs(col = "intersects")

函数lead() 简单地接受一个向量并将其内容向左移动一个元素:

dplyr::lead(1:3)
## [1]  2  3 NA

显然,该函数不知道如何处理向量的最后一个元素,但您可以提供您想要的值:

dplyr::lead(1:3, default = 7)
## [1] 2 3 7

还有一个类似的函数dplyr::lag() 会朝另一个方向移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多