R “少一个”;“银行标识代码”;玫瑰图中的数据处理
我遵循下面的教程,在这里可以复制/粘贴 在我的安装程序中,当我运行此程序时,会出现一个错误R “少一个”;“银行标识代码”;玫瑰图中的数据处理,r,ggplot2,R,Ggplot2,我遵循下面的教程,在这里可以复制/粘贴 在我的安装程序中,当我运行此程序时,会出现一个错误 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
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”垃圾桶和“23”垃圾桶组合在一起,给了我一个巨大的垃圾桶
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”bin组合在一起
非常感谢
编辑--下面的代码修复了该问题,但给出了警告。我不认为这个警告是个问题,但我很好奇是否有人能解释这一点。我认为最初的问题是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).
您的数据是连续的,因为
eventhour
是数字,但eventhour
的行为类似于一个有序的分类变量,因为所有eventhour
值都是一天中的整数小时。因此,您可以使用geom\u条形图
或geom\u柱状图
进行绘图。我将使用geom\u条形图代码>(用于分类数据)在下面的示例中,然后在末尾显示一个带有geom_直方图
(用于连续数据)的版本
使用geom_bar
时出现的问题是,条形图放置在整数小时上,但默认宽度为1个单位。这意味着,由于其宽度有限,条形图位于零(午夜)在零以下扩展0.5个单位。当您将x轴限制设置为零时,零处的条形将被排除,因为scale\u x\u continuous
排除限制范围之外的数据。但是,如果将限制设置为-0.5,则极坐标不再是0-24小时时钟
我将在下面展示多个示例,但它们都有一些类似的绘图元素,所以让我们将这些常用元素保存在一个可以重用的对象中
my_plot = list(coord_polar(start=0),
geom_bar(colour="grey"),
theme_minimal(),
scale_fill_brewer(),
ylab("Count"))
现在让我们看看没有coord\u polar
(我们通过执行my\u plot[-1]
)来排除coord\u polar
中的coord\u polar
状态。请注意,当条形宽度超出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_柱状图的等效图。binwidth=1
表示每个条形宽1小时。center=0
确保每个条形以整数为中心(我们可以在此处选择任何整数而不是0)。在某些情况下,垃圾箱在左侧还是右侧关闭也很重要(如果我们在这里设置,比如说,center=0.5
),这也很重要)。您可以使用closed
参数;closed=“right”
或closed=“left”
来设置
您发布的修复程序给了我一个错误错误:中断和标签必须具有相同的长度警告意味着ggplot实际上从绘图中删除了数据(可能是23小时的数据),因此没有包括所有数据。有关解释,请参阅。
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())