【问题标题】:R ggplot2 geom_bar axis limitsR ggplot2 geom_bar 轴限制
【发布时间】:2011-10-05 13:37:47
【问题描述】:

昨天我问了一个关于使用 ggplot2 (R ggplot2 ploting hourly data) 绘制每小时数据的问题,并根据收到的答案找到了解决方案。然后我成功地用 geom_line() 绘制温度数据。

我尝试将其应用于 geom_bar 以用条形图说明降水数据。但我无法设置 y 轴限制。我尝试了不同的方法,但找不到确切的点。

我的数据如下:

FECHA H_SOLAR;DIR_M;VEL_M;TEMP_M;HR;PRECIP
01/06/14 00:50:00;314.3;1.9;14.1;68.0;-99.9
01/06/14 01:50:00;322.0;1.6;13.3;68.9;-99.9
01/06/14 02:50:00;303.5;2.1;12.3;70.9;-99.9
01/06/14 03:50:00;302.4;1.6;11.6;73.1;-99.9
01/06/14 04:50:00;306.5;1.2;10.9;76.4;-99.9
01/06/14 05:50:00;317.1;0.8;12.6;71.5;-99.9
01/06/14 06:50:00;341.8;0.0;17.1;58.8;-99.9
01/06/14 07:50:00;264.6;1.2;21.8;44.9;-99.9
01/06/14 08:50:00;253.8;2.9;24.7;32.2;-99.9
01/06/14 09:50:00;254.6;3.7;26.7;27.7;10
01/06/14 10:50:00;250.7;4.3;28.3;24.9;12
01/06/14 11:50:00;248.5;5.3;29.1;22.6;-99.9
01/06/14 12:50:00;242.8;4.7;30.3;20.4;-99.9
01/06/14 13:50:00;260.7;4.9;31.3;17.4;-99.9
01/06/14 14:50:00;251.8;5.1;31.9;17.1;-99.9
01/06/14 15:50:00;258.1;4.6;32.4;15.3;-99.9
01/06/14 16:50:00;254.3;5.7;32.4;14.0;-99.9
01/06/14 17:50:00;252.5;4.6;32.0;14.1;-99.9
01/06/14 18:50:00;257.4;3.8;31.1;14.9;20
01/06/14 19:50:00;135.8;4.2;26.0;41.2;-99.9
01/06/14 20:50:00;126.0;1.7;23.5;48.7;16
01/06/14 21:50:00;302.8;0.7;21.6;53.9;-99.9
01/06/14 22:50:00;294.2;1.1;19.3;67.4;-99.9
01/06/14 23:50:00;308.5;1.0;17.5;72.4;-99.9

这是我正在尝试的代码

library(ggplot2)

datos=read.csv("meteo.dat",sep=";",header=T,na.strings="-99.9")

datos$dia=as.POSIXct(datos[,1], format="%y/%m/%d %H:%M:%S")

datos$PRECIP[is.na(datos$PRECIP)]=0   # to avoid NA values

ggplot(data=datos,aes(x=dia, y=PRECIP)) + geom_bar(colour="blue",stat="identity") +
ylab("Precipitación (l)") + xlab("Hora solar") + 
opts(title="Precipitacion acumulada horaria \n 2008-05-27 Burriana") + 
scale_x_datetime(limits=xlim) + 
scale_y_continuous(limits=c(0,50))

当像这样设置 y 轴的限制时,它不会像我预期的那样工作。如果我删除 y 轴设置,我不会总是得到相同的“自动”限制

这就是我不对 y 轴设置限制时得到的结果。我想设置限制,使条形更大(垂直)。

提前致谢

编辑:编辑显示对我有用的代码。

感谢安德烈、克里斯和布赖恩

# Setting axis limits
xlim = as.POSIXct(c("2008-05-27 00:00:00", "2008-05-27 23:50:00"))
ylim = trunc(max(datos$PRECIP) + 10)

# Ploting
ggplot(data=datos,aes(x=dia, y=PRECIP)) + geom_bar(colour="blue",stat="identity",fill="blue") +
ylab("Precipitación (l)") + xlab("Hora solar") + 
opts(title="Precipitacion acumulada horaria \n DIA NOMBRE") + 
scale_x_datetime(limits=xlim ,format = "%H",major='hour') + scale_y_continuous(limits=c(0,ylim))

现在的重点是对 PRECIP 数据进行子集化以找到 ylim。现在我得到了整个沉淀数据系列的最大值,而不是绘制日的最大值。我必须决定哪个更好,为系列中的所有日期设置相同的 y 限制,或者为任何一天更改轴。

再次感谢

【问题讨论】:

  • 你得到了什么,你期望得到什么?
  • 我试过你的代码。它不可重现,因为它在您的 x 轴代码中找不到对象 xlim。错误可能存在,而不是在您的 y 轴范围内。据我所知,y 轴限制应该有效(它适用于我的机器)。
  • 我也试过你的代码(删除scale_x_datetime,因为没有定义xlim,删除scale_y_continuous,因为这是问题所在)并得到了合理的缩放(0到20)y轴。只是推测,但我猜这只是数据的一个子集;也许你有一个极端的 PRECIP 值会影响比例但没有被绘制? max(datos$PRECIP) 是什么?
  • @Andrie 很抱歉我错过了 xlim 的定义,我将其定义为 xlim=as.POSIXct("2009-10-01 00:00:00","2009-11-31 23:00:00") ,因为我记得因为我家里没有代码。无论如何,语法是正确的,因为它适用于 geom_line()。
  • @BrianDiggs 嗨,布赖恩,我认为最大降水量是 45.5。我明天上班去看看

标签: r ggplot2


【解决方案1】:

@Andrie 是正确的。您似乎缺少xlim

使用上面的代码但删除scale_x_datetime

ggplot(data=datos,aes(x = dia, y = PRECIP)) + 
    geom_bar(colour = "blue",stat = "identity") +
    ylab("Precipitación (l)") + 
    xlab("Hora solar") +
    opts(title = "Precipitacion acumulada horaria \n 2008-05-27 Burriana") +
    scale_y_continuous(limits = c(0,50)) 

我明白了情节:

【讨论】:

  • 感谢 ChrisC,当我对 Andrie 发表评论时,我错过了在这里写下 xlim,但它对我使用 geom_line() 有效。也许 NA 值有问题......但它们应该从 PRECIP 中删除。我尝试过使用原始数据系列的不同子集,一天、一个月、一年,但找不到 y 限制的确切方法。明天上班时我会检查你的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2017-09-12
  • 2011-04-06
相关资源
最近更新 更多