在R语言中,绘图功能不考虑绘图类型

时间:2011-08-25 09:20:13

标签: r plot visualization

我有以下R脚本:

X <- read.table("/tmp/run178/data/monitor/portal_free_heap_monitor.log", header=T, sep=";")

P1 <- subset(X, Server=="PortalServer1")
P2 <- subset(X, Server=="PortalServer2")

png("mygraph.png")
plot(P1$Time, P1$HeapFreePercent, type="l", col="red")
lines(P2$Time, P2$HeapFreePercent, col="green")
q()

在生成的PNG图像中,“PortalServer1”的数据用点和黑色绘制,但它应该用红线绘制。另一个用绿线预期绘制。我做错了什么?

编辑:这是X的结构:

> str(X)
'data.frame':   5274 obs. of  3 variables:
 $ Time           : Factor w/ 2654 levels "2011.08.24 14:39:29",..: 1 1 2 2 3 3 4 4 5 5 ...
 $ Server         : Factor w/ 2 levels "PortalServer1",..: 1 2 1 2 1 2 1 2 1 2 ...
 $ HeapFreePercent: int  42 49 41 49 41 49 41 49 41 49 ...

2 个答案:

答案 0 :(得分:8)

@GavinSimpson已经就如何解决问题发表了评论。这应该是一个评论,但太长了。我只是用原始形式的数据解释你的情节发生了什么。

您正在绘制factor类型的数据。因此,当您调用函数plot时,S3方法调度将调用plot.factor

如果您阅读?plot.factor的帮助,您会注意到您获得的绘图类型也取决于您的第二个参数的类型。由于这也是一个因素,最终你的情节由spineplot绘制。因此,type="l"基本上被忽略了。颜色用红色绘制,但是......

对数据进行逆向工程,我得到类似的结果:

X <- data.frame(
    Time = sort(sample(letters, 100, replace=TRUE)),
    Server = sample(c("PortalServer1", "PortalServer2"), 100, replace=TRUE),
    HeapFreePercent = runif(100))
str(X)

P1 <- subset(X, Server=="PortalServer1")
P2 <- subset(X, Server=="PortalServer2")

plot(P1$Time, P1$HeapFreePercent, type="l", col="red")
lines(P2$Time, P2$HeapFreePercent, col="green")

enter image description here

答案 1 :(得分:0)

一种有点hacky的解决方案,但它适用于所有因素,而不仅仅是时间戳。

更改

plot(P1$Time, P1$HeapFreePercent, type="l", col="red")
lines(P2$Time, P2$HeapFreePercent, col="green")

plot(P1$Time, P1$HeapFreePercent, type="n")
lines(P1$Time, P1$HeapFreePercent, type="l", col="red")
lines(P2$Time, P2$HeapFreePercent, col="green")

此代码首先不绘制实际数据,只绘制轴。然后,它使用lines绘制实际数据,这可以避免调用plot.factor