【问题标题】:Ignoring one of the factors of ggplot in R忽略R中ggplot的因素之一
【发布时间】:2013-01-21 01:12:03
【问题描述】:

我使用 ggplot 来绘制我的变量和属性。我正在使用以下代码来使用 ggplot 和因子:

require(ggplot2)
require(reshape2)
df <- data.frame(HMn25_30$avg,HMn25_30$h)
df[3] = c("Normal",   
                "Normal",
                "Normal",
                "Normal",
                "Normal",
                "Normal",
                "Normal",
                "Normal",
                "Normal",
                "Normal",
                "Outlier",
                "Outlier",
                "Outlier",
                "Outlier",
                "Outlier",
                "Outlier",
                "Normal",
                "Outlier",
                "Outlier",
                "Normal",
                "Normal",
                "Outlier",
                "Outlier",
                "Normal",
                "Normal"
)
names(df)[1] <- 'Node 25'
names(df)[3] <-'Results'
df.m <- melt(df, names(df)[2:3], names(df)[1])
df.m$Results <- factor(df.m$Results)
df.m$HMn25_30.h <- strptime(as.character(df.m$HMn25_30.h), format = "%Y-%m-%d %H:%M:%S")
p <- ggplot(df.m, aes(x = HMn25_30.h, y = value, group = variable, color = variable))
p <- p + scale_shape_manual(values=c(20,22))
p <- p + geom_point(aes(shape = Results), cex=9, color= "blue3")
p <- p + theme(axis.text.x = element_text(angle = 90, hjust = 1, size=13,color="darkred"))
p <- p + scale_color_manual(values=c("Red"))
p <- p + ylim(-1,8)
p <- p + theme_bw()
p <- p + xlab('Date and Time') 
p <- p + ylab('Temprature') 
p <- p + ggtitle("Temporal Outliers of Node 25 ") + theme(plot.title = element_text(lineheight=3, face="bold", color="black", size=29))
p <- p + theme(legend.text = element_text(colour="darkred", size = 25))
p <- p + theme(legend.title = element_text(colour="brown", size=25))
p <- p + theme(axis.title.x = element_text(face="bold", colour="darkred", size=16),axis.text.x  = element_text(angle=90, vjust=0.5, size=26))
p <- p + theme(axis.title.x = element_text(face="bold", colour="darkred", size=14),axis.text.y  = element_text(angle=00, vjust=0.5, size=20))
p <- p + labs(x = "Date-Time [UTC] \ 2007-09-30 ", y = "Temprature  ")
p <- p + theme(axis.title.y = element_text(size = rel(2.1), angle = 90))
p <- p + theme(axis.title.x = element_text(size = rel(2.1), angle = 00))
p <- p + geom_line(size=1.9)
p

代码结果:

我只想显示“异常值”,并在图中省略“正常”因素。

样本数据:

       Node 25          HMn25_30.h Results
1   0.26000000 2007-09-29 23:00:00  Normal
2   0.01500000 2007-09-30 00:00:00  Normal
3  -0.35333333 2007-09-30 01:00:00  Normal
4  -0.42333333 2007-09-30 02:00:00  Normal
5  -0.73333333 2007-09-30 03:00:00  Normal
6  -0.65000000 2007-09-30 04:00:00  Normal
7  -0.40000000 2007-09-30 05:00:00  Normal
8  -0.09166667 2007-09-30 06:00:00  Normal
9   0.19000000 2007-09-30 07:00:00  Normal
10  0.63500000 2007-09-30 08:00:00  Normal
11  1.05500000 2007-09-30 09:00:00 Outlier
12  1.26833333 2007-09-30 10:00:00 Outlier
13  2.28166667 2007-09-30 11:00:00 Outlier
14  4.17000000 2007-09-30 12:00:00 Outlier
15  6.34000000 2007-09-30 13:00:00 Outlier
16  6.56666667 2007-09-30 14:00:00 Outlier
17  6.74666667 2007-09-30 15:00:00  Normal
18  5.82833333 2007-09-30 16:00:00 Outlier
19  6.36500000 2007-09-30 17:00:00 Outlier
20  4.60333333 2007-09-30 18:00:00  Normal
21  4.98000000 2007-09-30 19:00:00  Normal
22  2.65666667 2007-09-30 20:00:00 Outlier
23  4.90833333 2007-09-30 21:00:00 Outlier
24  5.05000000 2007-09-30 22:00:00  Normal
25  4.56500000 2007-09-30 23:00:00  Normal

【问题讨论】:

    标签: r ggplot2 r-factor


    【解决方案1】:

    您可以在对geom_point 的调用中添加subset 参数,并使用plyr .() 函数来定义子集。

    例如

    p + geom_point(aes(x = HMn25_30.h, y = value, colour = variable), subset = .(Results == 'Outlier'))
    

    一个很好的可重现的小例子

    DF <- data.frame(a = letters[1:4], b = 1:10)
    
    library(plyr) # must be explicitly loaded
    
    
     ggplot(DF, aes(x = b, y = b)) + 
      geom_point(subset = .(a == 'a'), colour = 'blue') + 
      geom_point(subset = .(a == 'c'), colour = 'green') +
      geom_line()
    

    【讨论】:

    • 谢谢 - 这正是我要找的 :)
    【解决方案2】:

    Results == "Outlier" 所在的数据框子集用于geom_point 命令:

    p <- p + geom_point(data = df.m[df.m$Results == "Outlier",], 
                        cex=9, color= "blue3", shape = 22) 
    

    那么,就不需要scale_shape_manual 命令了。

    完整代码:

    library(ggplot2)
    p <- ggplot(df.m,
                aes(x = HMn25_30.h, y = value, group = variable, color = variable))
    #p <- p + scale_shape_manual(values=c(20,22))                 # command removed
    p <- p + geom_point(data = df.m[df.m$Results == "Outlier",], 
                        cex=9, color= "blue3", shape = 22)        # command modified
    p <- p + theme(axis.text.x = element_text(angle = 90, hjust = 1, size=13,
                   color="darkred"))
    p <- p + scale_color_manual(values=c("Red"))
    p <- p + ylim(-1,8)
    p <- p + theme_bw()
    p <- p + xlab('Date and Time') 
    p <- p + ylab('Temprature') 
    p <- p + ggtitle("Temporal Outliers of Node 25 ") + 
             theme(plot.title = element_text(lineheight=3, face="bold", 
                   color="black", size=29))
    p <- p + theme(legend.text = element_text(colour="darkred", size = 25))
    p <- p + theme(legend.title = element_text(colour="brown", size=25))
    p <- p + theme(axis.title.x = element_text(face="bold",colour="darkred" size=16),
                   axis.text.x  = element_text(angle=90, vjust=0.5, size=26))
    p <- p + theme(axis.title.x = element_text(face="bold",colour="darkred",size=14),
                   axis.text.y  = element_text(angle=00, vjust=0.5, size=20))
    p <- p + labs(x = "Date-Time [UTC] \ 2007-09-30 ", y = "Temprature  ")
    p <- p + theme(axis.title.y = element_text(size = rel(2.1), angle = 90))
    p <- p + theme(axis.title.x = element_text(size = rel(2.1), angle = 00))
    p <- p + geom_line(size=1.9)
    p
    

    【讨论】:

      【解决方案3】:

      您尚未提供包含您的数据的可重现代码,但您似乎可以通过简单的子集来实现这一点。尝试更改此行:

      p <- ggplot(df.m, aes(x = HMn25_30.h, y = value, group = variable,
                                               color = variable))
      

      到这里:

      p <- ggplot(df.m[df.m$Result == "Outlier", ], aes(x = HMn25_30.h, y = value,
                                          group = variable, color = variable))
      

      如果我正确理解您的数据框的结构,应该只绘制 Results 列的值为 Outlier 的行。

      【讨论】:

      • 您的代码的问题在于,它忽略了不离群的地方。我想要完整的线条,但只忽略 Normal 的符号
      • 所以您希望将Outlier 数据 绘制为一条线,但您不想在线上的这些点使用符号?
      • 不,我希望将异常值和正常数据都绘制为线。通过符号仅显示异常值。
      • 也许将法线点的颜色改为白色或透明?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多