我遵循以下教程,这里可以复制/粘贴。
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)的数据
我已尝试在我自己的数据集上运行此操作(下面的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))
请注意,这是我数据的一小部分,因为它有数百万个时间戳。
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).
答案 0 :(得分:1)
您的数据在eventhour
是数字的意义上是连续的,但eventhour
的行为类似于有序的分类变量,因为所有eventhour
值都是一天中的整数小时。因此,您可以使用geom_bar
或geom_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)")
现在让我们将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())
所以,最终的情节代码是:
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())