缺少一个" bin"玫瑰图

时间:2017-07-07 15:43:54

标签: r ggplot2

我遵循以下教程,这里可以复制/粘贴。

http://rstudio-pubs-static.s3.amazonaws.com/3369_998f8b2d788e4a0384ae565c4280aa47.html

在我的设置中,当我运行此操作时,出现错误

Error: Width` is deprecated. Do you want `geom_bar()`?

所以我将geom_hist换成geom_bar,制作我的代码......

ggplot(eventdata, aes(x = eventhour)) + geom_bar(breaks = seq(0, 24), width = 1, colour = "grey") + coord_polar(start = 0) + theme_minimal() + scale_fill_brewer() + ylab("Count") + ggtitle("Events by Time of day") + scale_x_continuous("", limits = c(0, 24), breaks = seq(0, 24), labels = seq(0, 24))

但是,我得到的图表非常不同。检查,似乎它"失踪"从午夜到凌晨1点(00:00:00到00:59:59,event_hour = 0)的数据

enter image description here

我已尝试在我自己的数据集上运行此操作(下面的dput),我得到了类似的奇怪错误....它结合了" 0" bin和" 23" bin给了我一个巨大的垃圾箱。

gplotAll = ggplot( eventdataAll, aes(x=eventdataAll$eventhour) ) +
  geom_histogram(breaks=seq(0,24), colour="purple") + coord_polar(start=0) +
  theme_minimal() + scale_fill_manual(values="blue") + ylab("Frequency") + 
  ggtitle("All Sources") + scale_x_continuous("", limits=c(0,24), 
  breaks=seq(0,24), labels=seq(0,24))

enter image description here

请注意,这是我数据的一小部分,因为它有数百万个时间戳。

dput(eventdataAll[1:100,] )

structure(list(datetime = structure(c(1499433307, 1499428942, 
1499426105, 1499422506, 1499466293, 1499408104, 1499476505, 1499411705, 
1499400905, 1499466368, 1499454358, 1499453483, 1499405930, 1499484602, 
1499483709, 1499480109, 1499408108, 1499445444, 1499439817, 1499427520, 
1499418054, 1499416518, 1499414449, 1499410178, 1499409748, 1499409317, 
1499405867, 1499402279, 1499485071, 1499481544, 1499481527, 1499481459, 
1499481423, 1499481407, 1499477859, 1499475634, 1499474292, 1499474275, 
1499474253, 1499470435, 1499468435, 1499468413, 1499468398, 1499467032, 
1499464834, 1499463580, 1499463425, 1499461391, 1499460152, 1499460150, 
1499459806, 1499459745, 1499459366, 1499458914, 1499458463, 1499458012, 
1499457635, 1499457619, 1499455777, 1499454624, 1499454035, 1499454020, 
1499452801, 1499452695, 1499450434, 1499450414, 1499450404, 1499450403, 
1499450156, 1499446834, 1499446818, 1499446803, 1499445621, 1499444273, 
1499443234, 1499443218, 1499443201, 1499441873, 1499441806, 1499441700, 
1499441096, 1499441095, 1499440418, 1499440417, 1499436056, 1499434899, 
1499432434, 1499431018, 1499428801, 1499427491, 1499425201, 1499423442, 
1499421620, 1499421134, 1499427667, 1499421549, 1499472830, 1499451306, 
1499450792, 1499482802), class = c("POSIXct", "POSIXt"), tzone = ""), 
    eventhour = c(9L, 8L, 7L, 6L, 18L, 2L, 21L, 3L, 0L, 18L, 
    15L, 14L, 1L, 23L, 23L, 22L, 2L, 12L, 11L, 7L, 5L, 4L, 4L, 
    2L, 2L, 2L, 1L, 0L, 23L, 22L, 22L, 22L, 22L, 22L, 21L, 21L, 
    20L, 20L, 20L, 19L, 19L, 19L, 18L, 18L, 18L, 17L, 17L, 17L, 
    16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 15L, 15L, 
    15L, 15L, 14L, 14L, 14L, 14L, 14L, 14L, 13L, 13L, 13L, 13L, 
    12L, 12L, 12L, 12L, 12L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
    10L, 9L, 9L, 8L, 8L, 7L, 7L, 6L, 6L, 5L, 7L, 5L, 20L, 14L, 
    14L, 23L)), .Names = c("datetime", "eventhour"), row.names = c(NA, 
100L), class = "data.frame")

有关

的任何信息

(1)为什么第一个复制/粘贴的例子不提供" 0"在图中

(2)为什么我的例子结合了" 23"和" 0"仓

非常感谢。

编辑 - 以下代码修复了该问题,但发出了警告。我不认为警告是一个问题,但如果有人能够解释这个,我很好奇。我相信最初的问题是R将中断解释为(val1,val2)而不是像我预期的那样[val1,val2]。因此,0分组从未被保留。将我的中断改为seq(-1:23)是现在包含0到23的所有值。

修复:

gplotAll = ggplot( eventdataAll, aes(x=eventdataAll$eventhour) ) + 
  geom_histogram(breaks=seq(-1,24), colour="purple") + coord_polar(start=0) +
  theme_minimal() + scale_fill_manual(values="purple") + ylab("Frequency") + 
  ggtitle("All Sources") + scale_x_continuous("", limits=c(-1,23), 
  breaks=seq(-1,23), labels=seq(0,2) )

警告:

Removed 1 rows containing missing values (geom_bar). 

1 个答案:

答案 0 :(得分:1)

您的数据在eventhour是数字的意义上是连续的,但eventhour的行为类似于有序的分类变量,因为所有eventhour值都是一天中的整数小时。因此,您可以使用geom_bargeom_histogram执行绘图。我将在下面的示例中使用geom_bar(用于分类数据),然后在结尾处显示带有geom_histogram(用于连续数据)的版本。

您使用geom_bar时遇到的问题是由于条形图位于整数小时,但默认宽度为1个单位。这意味着,由于它的有限宽度,零(午夜)的条形延伸到零以下0.5个单位。当您将x轴限制设置为零时,将排除零位条,因为scale_x_continuous会排除limits范围之外的数据。但是,如果将限制设置为-0.5,则极坐标不再是0-24小时。

我将在下面展示多个示例,但它们都有一些类似的绘图元素,所以让我们将这些常用元素保存在我们可以重用的对象中。

my_plot = list(coord_polar(start=0),
               geom_bar(colour="grey"),
               theme_minimal(),
               scale_fill_brewer(),
               ylab("Count"))

现在让我们看看geom_bar没有coord_polar会发生什么(我们通过coord_polar排除了my_plot中的my_plot[-1]声明。注意当条形宽度超出x范围(下面的第一个图形)时,如何排除午夜条形(eventhour = 0),但是当我们将范围扩展到-0.5(下面的第二个图形)时,会出现这个条形图,这是酒吧的边缘。

ggplot(eventdata, aes(x = eventhour)) + 
  my_plot[-1] +
  scale_x_continuous(limits = c(0,24), breaks=0:23) +
  ggtitle("x-limits: c(0,24)")

ggplot(eventdata, aes(x = eventhour)) + 
  my_plot[-1] +
  scale_x_continuous(limits = c(-0.5,24), breaks=0:23) + 
  ggtitle("x-limits: c(-0.5,24)")

enter image description here

现在让我们将coord_polar添加到上面的第二个图中。代码就在下面,情节在左下方。请注意,0现在顺时针旋转,在0之前有一个额外的半小时楔形。

要解决这些问题,我们将更改coord_polar语句,将图形逆时针旋转7.5度(圆圈的1/48),并从图表的另一端移出半小时将限制更改为23.5而不是24.这不会删除任何数据,因为最高小时值为23.

我们还删除了较小的网格线,以消除不必要的网格线,否则这些网格线将在23.5小时出现。在所有半小时内实际上都有较小的网格线,但是这一次被绘制了两次(因为它代表-0.5和23.5小时),因此比其他网格更突出。我们这里并不需要很小的网格线,所以我们完全摆脱它们。

此图的代码是下面的第二个ggplot块,图表位于右侧。

ggplot(eventdata, aes(x = eventhour)) + 
  my_plot +
  scale_x_continuous(limits = c(-0.5,24), breaks=0:23) +
  ggtitle("x-limits: c(-0.5,24)")

ggplot(eventdata, aes(x = eventhour)) + 
  my_plot[-1] +
  scale_x_continuous(limits = c(-0.5,23.5), breaks=0:23) +
  ggtitle("x-limits: c(-0.5,23.5)")  +
  coord_polar(start=-48/360) +
  theme(panel.grid.minor=element_blank())

enter image description here

所以,最终的情节代码是:

ggplot(eventdata, aes(x=eventhour)) + 
  geom_bar(colour="grey") + 
  theme_minimal() +
  scale_fill_brewer() +
  ylab("Count") +
  coord_polar(start=-48/360) +
  scale_x_continuous(limits=c(-0.5,23.5), breaks=0:23) +
  theme(panel.grid.minor=element_blank())

下面是geom_histogram的等效图。 binwidth=1表示每个栏宽1小时。 center=0确保每个栏都以整数为中心(我们可以在这里选择任意整数而不是0)。在某些情况下,这些箱子是左侧还是右侧是关闭的(如果我们设置,例如center=0.5,这将很重要)。您可以使用closed参数进行设置; closed="right"closed="left"

ggplot(eventdata, aes(x=eventhour)) + 
  geom_histogram(colour="grey", center=0, binwidth=1) + 
  theme_minimal() +
  scale_fill_brewer() +
  ylab("Count") +
  coord_polar(start=-48/360) +
  scale_x_continuous(limits=c(-0.5,23.5), breaks=0:23) +
  theme(panel.grid.minor=element_blank())