【问题标题】:How to change color for certain points in a plot that has been saved with an object in R?如何更改已与 R 中的对象一起保存的绘图中某些点的颜色?
【发布时间】:2020-02-09 18:10:38
【问题描述】:

大家!

我正在处理一个 RMarkdown 文件。我在之前的块中绘制了一些东西并将该图保存在一个对象中,例如 'img',因为我想在后续块中对该图执行一些操作。如何在不更改其他任何内容的情况下更改 'img' 中某些点的颜色?或者我可以至少添加一些该颜色的新点来覆盖某些点吗?

我在网上找到的一些代码如下所示,但它对我不起作用。一直说“plot.new 还没有被调用”。而作为 R 的初学者,恐怕我不明白为什么 plot.new( ) 在这种情况下是相关的。

   img
   points(x,y, col="black", psh=15, cex=2)
   img <- recordPlot()

另外,我不确定这是在不同块中修改绘图的正确方法。如果有更好的方法,请告诉我!非常感谢!

【问题讨论】:

    标签: r plot colors r-markdown igraph


    【解决方案1】:

    如果您还没有设置绘图窗口,则不能调用points(),这是plot.new() 会做的。通常你不会直接调用plot.new(),其他一些函数(例如plot())会在做其他事情之前调用它。

    所以这种绘制方式应该可以添加一些要点:

    x <- rnorm(100)
    y <- rnorm(100)
    plot(x, y, col = "red")   # implicit call to plot.new()
    img <- recordPlot()
    
    dev.off()                 # clears the display; not needed in RMarkdown
    img                       # redraws the first plot
    points(rnorm(100), rnorm(100), col = "green") # adds green points
    

    更改点的颜色可能效果不佳,因为抗锯齿意味着旧颜色可能会漏掉。但是这个序列应该把原来的点变成绿色:

    img
    points(x, y, col = "green")
    

    【讨论】:

      【解决方案2】:

      如果您要编辑一堆图,您可能需要考虑使用ggplot2 作为您的图形库而不是基础。有很多很多在线资源可以帮助您从那里开始。这里只是一个简单的例子:

      library(ggplot2)
      
      img <- ggplot(mtcars) +
        geom_point(aes(x = hp, y = mpg))
      
      img
      

      现在假设您想为一些点着色。这个向量会将所有点都设为lightblue,然后将前5个点设置回black

      point_colors <- rep("lightblue", nrow(mtcars))
      point_colors[1:5] <- "black"
      

      我们可以将它直接叠加到图的顶部:

      img <- img +
        geom_point(aes(x = hp, y = mpg), color = point_colors)
      
      img
      

      使用ggplot2,我们可以通过运行img$layers 来查看绘图是如何分层的:

      > img$layers
      [[1]]
      mapping: x = ~hp, y = ~mpg 
      geom_point: na.rm = FALSE
      stat_identity: na.rm = FALSE
      position_identity 
      
      [[2]]
      mapping: x = ~hp, y = ~mpg 
      geom_point: na.rm = FALSE
      stat_identity: na.rm = FALSE
      position_identity 
      

      我们可以通过将图层设置为 null 来移除它:

      img$layers[[1]] <- NULL
      
      > img$layers
      [[1]]
      mapping: x = ~hp, y = ~mpg 
      geom_point: na.rm = FALSE
      stat_identity: na.rm = FALSE
      position_identity
      

      所以现在我们删除了原来的图层,只剩下颜色改变了的那个。使用 ggplot2,以后可以很容易地进行更改(尤其是干净的添加)。

      img +
        ggtitle("only one layer!") +
        theme_light()
      

      【讨论】:

      • 嘿,亚当。这听起来像是一个奇妙的想法!非常感谢!尽管我尝试并再次发生错误,说“二进制运算符的非数字参数”。我也不明白。难道是因为img 是用igraph 而不是ggplot2 绘制的随机图?
      • 是的,很有可能。通常需要在单一的图形范式下操作!
      • 我明白了。我会尝试别的。非常感谢! @亚当
      猜你喜欢
      • 2016-03-13
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多