【问题标题】:Fill the area in specific points in a ggplot在ggplot中的特定点填充区域
【发布时间】:2017-10-04 16:50:14
【问题描述】:

我正在尝试创建一个图,我只能在使用 ggplot2 的系数显着的点处填充该区域。

我已经创建了这个例子:

dt <- data.table(x = 0:23, y = c(0.00788665622373638, 0, 0, 0, 
                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0.031263597681424, 0.0483478996438207, 
                     0.0339161353262161, 0, 0, 0, 0, 0, 0, 0, 0), value = c(0.335524374372203, 
                                                                            0.310445022036626, 0.00348268861151579, 0.000645923627809575, 
                                                                            0.0025476114971974, 0.000979901982654185, 0.00447235816030944, 
                                                                            0.000375791689380511, 0.00850170357523439, 0.185246478252772, 
                                                                            0.236061996429638, 0.611479957550591, 0.916055517054685, 0.047195113633542, 
                                                                            0.00170024647583689, 0.0138696238231373, 0.700687775315984, 0.0562079029293676, 
                                                                            0.00527934454203627, 0.00870851100765857, 0.005848832805464, 
                                                                            0.00300379176492194, 0.00400049813928849, 0.323674152828656))

并使用以下代码:

plt <- ggplot(dt,aes(x=x,y=y)) + geom_line(colour='blue') + geom_point() + geom_area(data=subset(dt,value<0.1 & y > 0),fill='skyblue',alpha=0.3)

我得到这张图:

似乎正在连接值低于 0.1 的点,我只想为value 低于 0.1 的线下的区域着色。

有没有办法解决这个问题?

【问题讨论】:

    标签: r ggplot2 graph


    【解决方案1】:

    我一直在尝试提供一个函数来转换数据,以便可以根据请求绘制数据,这样做我发现了这个想法中的一个潜在问题。
    考虑一个点 x,其中 y 为正且值 0.1。使用 geom_area 这个点将被忽略,因为一条线的面积是 0。因此我相信其他几个可视化可能更有益:
    geom_linerange 或 geom_pointrange 可能更好(并且更容易绘制),这是您的数据示例。它强调 value 0 的点。

    ggplot(dt,aes(x=x,y=y)) +
      geom_line(colour='blue') +
      geom_point() +
      geom_linerange(data = dt[dt$value < 0,1,], aes(ymin = 0, ymax = y), color= "skyblue", size = 1)
    

    geom_point 强调 value

    ggplot(dt,aes(x=x,y=y)) +
      geom_line(colour='blue') +
      geom_point() +
      geom_point(data = dt[dt$value < 0.1,], color= "red", size = 2)  
    

    如果你真的打算使用 geom_area 这里是一个函数(仅基础 R):

    for_area = function(data, val){
      df = data
      v = ifelse(df$value >= val, 0, df$value)
      y = ifelse(df$value >= val, 0, df$y)
      df$value = v
      df$y = y
    
     pre = lapply(2:nrow(df), function(i){
        pre = ifelse(df$y[i-1] == 0 & df$y[i] !=0, i, 0)
        return(pre)
      })
      pro = lapply(1:nrow(df), function(i){
        pro = ifelse(df$y[i] != 0 & df$y[i+1] ==0, i, 0)
        return(pro)
      })      
      pre = do.call(rbind, pre)
      pro = do.call(rbind, pro)
      pre = pre[pre>0]
      pro = pro[pro>0]
      pre = df$x[pre]
      pro = df$x[pro]
      df$x1 = 1
        df = rbind(df, data.frame(x = pre,
                            y = rep(0, length(pre)),
                            value = rep(0, length(pre)),
                            x1 = rep(0, length(pre))))    
    
       df = rbind(df, data.frame(x = pro,
                                 y = rep(0, length(pro)),
                                 value = rep(0, length(pro)),
                                 x1 = rep(2, length(pro))))
       df = df[with(df, order(x, x1)),]
       return(df)      
    }
    

    使用操作中的数据:

    ggplot(dt,aes(x=x,y=y)) +
      geom_line(colour='blue') +
      geom_point() +
      geom_area(data = for_area(dt, 0.1), fill= "skyblue", alpha = 0.3)
    

    举个更复杂的例子:

    dput(daf)
    structure(list(x = 1:25, y = c(0.3, 0.2, 0.2, 0, 0.1, 0.1, 0.3, 
    0.2, 0.3, 0.1, 0, 0.3, 0.2, 0.1, 0.3, 0, 0.2, 0.3, 0, 0.1, 0.1, 
    0.2, 0.3, 0, 0.3), value = c(0, 0.3, 0, 0, 0, 0.2, 0.3, 0.2, 
    0.2, 0.3, 0.2, 0.2, 0, 0, 0.2, 0, 0.2, 0, 0.1, 0.1, 0.1, 0, 0.3, 
    0.2, 0.3)), .Names = c("x", "y", "value"), row.names = c(NA, 
    -25L), class = "data.frame")
    

    这说明了我之前提到的一些问题:x = 3 处的值是 0.0,而 y = 0.2 但没有指示,因为 x = 4 和 x = 2 的值 > 0.1 的 y ==0

    使用 geom_pointrage 这将变成:

    也许从两个世界中选择最好的:

    ggplot(daf,aes(x=x,y=y)) +
      geom_line(colour='blue') +
      geom_point() +
      geom_area(data = for_area(daf, 0.1), fill= "skyblue", alpha = 0.3 )+
      geom_linerange(data = daf[daf$value<0.1,], aes(ymin = 0, ymax = y), color= "skyblue", size = 1)
    

    【讨论】:

    • 对,但你正在填充所有内容,我只想填充 value 变量中小于 0.1 的值
    • 我认为您的答案适用于这些特殊情况,但是当我尝试使用不同的数据重现结果时,我没有得到我想要的结果。我现在编辑了dt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2012-02-06
    • 2016-05-16
    • 2018-10-20
    相关资源
    最近更新 更多