【问题标题】:How to do selective labeling with GGPLOT geom_point()如何使用 GGPLOT geom_point() 进行选择性标记
【发布时间】:2013-02-22 01:26:58
【问题描述】:

使用此代码:

library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()
p + geom_point() + geom_text(aes(wt, mpg, label=row.names(mtcars)))

我得到这张图:

如何修改上面的代码,使其仅标记wt &gt; 4mpg &gt; 25 的位置, 而其余的点仍未标记。

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    geom_text 提供data 参数:

    library(ggplot2)
    mtcars$name <- row.names(mtcars)
    p <- ggplot(mtcars, aes(wt, mpg))
    p + geom_point()
    p + geom_point() + 
      geom_text(data=subset(mtcars, wt > 4 | mpg > 25),
                aes(wt,mpg,label=name))
    

    结果图:

    PS:我真的不喜欢 p + geom() 构建 ggplots 的风格,我很确定 hadley 在最初的 ggplot2 书中这样做是为了展示对同一情节的不同修改,但人们似乎选择了它启动并运行。这是我的做法:

    • 只需将绘图的不同组件与+ 一起添加即可,不要保存每个中间步骤。
    • 除非确实需要,否则不要费心将其保存到变量中,如果需要,您仍然可以将其保存到文件中ggsave()
    • 将所有将应用于整个情节的美学放在第一个ggplot 调用中,仅在必要时修改其他内容

    我的版本:

    ggplot(mtcars, aes(wt, mpg, label=name)) +
      geom_point() +
      geom_text(data=subset(mtcars, wt > 4 | mpg > 25))
    

    【讨论】:

      【解决方案2】:

      您可以将subset 参数传递给层。在您的情况下,这需要将行名作为一列,因此可以正确评估它们。您需要显式加载 plyr 以获取函数 .,这使得语法变得简单。

      # shamelessly using @marius initial code
      library(ggplot2)
      library(plyr)
      mtcars$name <- row.names(mtcars)
      p <- ggplot(mtcars, aes(wt, mpg))
      
      p + geom_point() + geom_text(aes(wt,mpg,label=name), subset = .(wt > 4 | mpg > 25))
      

      【讨论】:

        【解决方案3】:

        你可以得到一个额外的变量:

        carnames <- row.names(mtcars)
        carnames[with(mtcars, !(wt > 4 | mpg > 25))] <- ""
        
        p + geom_point() + geom_text(aes(wt,mpg,label=carnames))
        

        【讨论】:

          【解决方案4】:

          类似 ggplot2 的格子解决方案 :-)

            library(latticeExtra)
            xyplot(mpg~wt, data=mtcars,pch=19,
                   panel =function(x,y,...){
                   #  panel.xyplot(x,y,...)
                     data=subset(mtcars, wt > 4 | mpg > 25)
                     panel.text(data$wt,data$mpg,label=row.names(data),
                                col='red',cex=2)
                   },par.settings = ggplot2like(), axis = axis.grid)
          

          【讨论】:

            【解决方案5】:
            library(ggrepel)
            
            mtcars$name <- row.names(mtcars)
            
            ggplot(mtcars, aes(wt, mpg, label=name)) +
            
            geom_point() +
            
            geom_text_repel(data=subset(mtcars, wt > 4 | mpg > 25), aes(label=name))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-09-01
              • 1970-01-01
              • 2022-12-31
              • 2020-07-23
              • 2012-01-02
              • 1970-01-01
              • 1970-01-01
              • 2019-05-31
              相关资源
              最近更新 更多