【问题标题】:display only plotted data in the legend仅在图例中显示绘制的数据
【发布时间】:2018-06-07 13:17:53
【问题描述】:

考虑以下示例:

library(ggplot2)
df = data.frame(x = 1:5, y = 1:5, z = c('a', 'a', 'a', 'b', 'b'))

ggplot(df, aes(x, y, col = z)) + geom_line() + geom_point() +
  coord_cartesian(xlim = c(1, 2.5))

仅显示来自a 存储桶的数据,但ab 都出现在图例中。我该如何解决这个问题,以便只有实际绘制的存储桶出现在图例中?

对于上下文 - 我在 shiny 中尝试 zooming into plots 时遇到了这个问题。

【问题讨论】:

  • 如果您在可见绘图区域之外有点,这是缩放后的情况,那么显示所有不同的点类是默认行为。
  • @Heikki haha​​,好吧,这不是我想要的 - 所以这个问题
  • 您可以使用shiny 返回的内容来过滤数据,而不是使用coord_cartesian 指定它
  • df %>% filter(between(x, 1,2)) %>% ggplot(aes(x, y, col = z)) + geom_point()
  • @bouncyball/dmik3kno 谢谢!这非常接近我想要的。唯一的皱纹(在你的建议之后我现在才意识到)是我实际上正在绘制线条,如果可能的话,我想保持线条进出放大区域。我已经更新了问题中的情节——我想保留的那条线是情节右边的那条线。

标签: r ggplot2 shiny


【解决方案1】:

过滤z 是否涵盖您的实际用例?例如:

library(tidyverse)

df = data.frame(x = 1:5, y = 1:5, z = c('a', 'a', 'a', 'b', 'b'))

ggplot(df %>% filter(z %in% z[between(x,1,2.5)]), 
       aes(x, y, col = z)) + 
  geom_line() + geom_point() +
  coord_cartesian(xlim = c(1, 2.5))

或者在一个可以针对用户输入的美学变量进一步泛化的函数中。 (我还更新了函数,即使在不包含数据点的绘图区域中也可以使用插值来绘制线条,只要点之间至少有一条连接线穿过绘图区域。)

my_plot = function(xrng, data=df, step=0.01) {

  levs = unique(data[["z"]])  
  n = length(levs)

  # Generate interpolated data frame so we can plot lines even if 
  # no points appear in the graph region 
  dat_interp = split(data, data$z) %>% 
    map_df(function(d) {
      x = seq(min(d$x), max(d$x), step)
      data.frame(z=rep(unique(d$z), each=length(x)),
                 x, y=rep(approx(d$x, d$y, xout=x)$y, n))
    })

  ggplot(dat_interp %>% filter(z %in% z[between(x,xrng[1],xrng[2])]), 
         aes(x, y, col = z)) + 
    geom_point(data=data %>% filter(z %in% z[between(x,xrng[1],xrng[2])])) +
    geom_line() + 
    coord_cartesian(xlim = xrng) +
    scale_color_manual(values=setNames(hcl(seq(15,375,length=n+1)[1:n],100,65), levs))
}


gridExtra::grid.arrange(
  my_plot(c(1,2.5)),
  my_plot(c(1,4)),
  my_plot(c(3,4)),
  my_plot(c(4.3,6)),
  my_plot(c(1.1,1.6)),
  my_plot(c(4.2,4.9)))

【讨论】:

  • 谢谢!点击几下后 - 这不包括my_plot(c(1.1, 1.6)) 案例,但它对我来说是一个足够好的解决方案。
  • 我已经更新了答案以使用插值来处理绘图区域中没有数据点的情况。
猜你喜欢
  • 2016-11-07
  • 2020-01-31
  • 2020-02-07
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多