【问题标题】:Label the points as date in the proper format in ggplot in R在R中的ggplot中以正确格式将点标记为日期
【发布时间】:2018-01-01 01:42:08
【问题描述】:

我正在使用 R 中的 ggplot2 绘制折线图。我想以正确的日期格式命名高于某个阈值的点。

我绘制图表的代码是:

ggplot(DateSubset1, aes(TimeStamp)) + 
    geom_line(aes(y = CPU, colour = "Orange")) + 
    geom_line(aes(y = MEM), colour = "Black")+
    scale_x_datetime(date_break = "1 days")+
    geom_point(aes (x= TimeStamp, y=CPU), size = 1,colour = "Purple", 
        subset(DateSubset1, CPU>25 ))+
    geom_point(aes (x= TimeStamp, y=MEM), size = 1,colour = "Blue", 
        subset(DateSubset1, MEM>10 ))+
    scale_y_continuous(breaks = c(5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80))

我的图表如下所示:

我想用我的数据集所具有的正确日期格式标记这些点(高于某个阈值)。 我试过了

geom_text(aes(y=CPU, label= ifelse(CPU>25, TimeStamp, '')))

使用这个我的图表看起来像:

geom_text(aes(y= CPU,label= ifelse(CPU>25, format(TimeStamp), format = 
"%y%m%d %h%m%s",'')))

geom_text(aes(y= CPU, label=ifelse(CPU>25, as.Date(TimeStamp), '')))

geom_text(aes(y= CPU, label=ifelse(CPU>25, as.Date.POSIXct(TimeStamp), '')))

数据集字符串:

data.frame':    
1420 obs. of  3 variables:
$ TimeStamp: POSIXct, format: "2017-06-28 07:03:02" "2017-06-28 07:06:01" 
"2017-06-28 07:09:01" ...
$ CPU      : num  0.9 0.8 12.2 3.7 2.3 1.7 1.4 1.1 1 0.9 ...
$ MEM      : num  1.7 1.8 1.5 1.8 1.8 1.8 1.9 1.9 1.9 2.1 ...

示例数据如下所示:

TimeStamp                CPU   MEM
2017-06-28 07:03:02      0.9   1.7
2017-06-28 07:06:01      0.8   1.8
2017-06-28 07:09:01      12.2  1.5
2017-06-28 07:12:01      3.7   1.8
2017-06-28 07:15:01      2.3   1.8

【问题讨论】:

  • 请提供示例数据,以便他人生成您的图。
  • 不是重复的,因为问题是将文本标签格式化为日期
  • 请提供示例数据! “时间戳”是什么样的?您能否在 geom_text 调用之外将时间戳转换为 POSIXct?
  • 数据集的字符串是data.frame': 1420 ob​​s。 3 个变量:$ 时间戳:POSIXct,格式:“2017-06-28 07:03:02”“2017-06-28 07:06:01”“2017-06-28 07:09:01”... $ CPU:数字 0.9 0.8 12.2 3.7 2.3 1.7 1.4 1.1 1 0.9 ... $ 内存:数字 1.7 1.8 1.5 1.8 1.8 1.8 1.9 1.9 1.9 2.1 ...

标签: r ggplot2 label geom-text line-plot


【解决方案1】:

好的,试试这个代码:

zz = '
   CPU   MEM
   0.9   1.7
   0.8   1.8
   12.2  1.5
'

df <- read.table(text = zz, header = TRUE)
df

TmS = c("2017-06-28 07:03:02", "2017-06-28 07:06:01", "2017-06-28 07:09:01")
df = cbind(TmS, df)
df$TmS = as.character(df$TmS)

label = as.character(ifelse(df$CPU>10, df$TmS, ''))
df$TmS = as.POSIXct(df$TmS)


ggplot(df, aes(TmS)) + 
  geom_line(aes(y = CPU, colour = "Orange")) + 
  geom_line(aes(y = MEM), colour = "Black")+
  scale_x_datetime(date_break = "1 days")+
  geom_point(aes (x= TmS, y=CPU), size = 1,colour = "Purple", 
             subset(df, CPU>10))+
  geom_point(aes (x= TmS, y=MEM), size = 1,colour = "Blue", 
             subset(df, MEM>1.5))+
  scale_y_continuous(breaks = c(5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80))+
  geom_text(aes(y= CPU, label=label))

【讨论】:

  • 当我尝试这个时,我看到了这个错误 - unclass(x)/86400 中的错误:二进制运算符的非数字参数
  • 我进行了更改。如果您还有其他问题,请告诉我。
  • 是的,我明白了。谢谢!!有什么办法可以避免标签重叠?
  • 嗯,我不认为有一个简单的解决方案。看看这里:stackoverflow.com/questions/21585128/…
  • 我明白了。我们可以使用 ggrepel 包。并使用 geom_text_repel 代替 geom_text
猜你喜欢
  • 2017-12-17
  • 2015-10-25
  • 2020-06-08
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多