ggplot2 圆形数据的密度

Posted

技术标签:

【中文标题】ggplot2 圆形数据的密度【英文标题】:ggplot2 density of circular data 【发布时间】:2016-07-15 22:50:58 【问题描述】:

我有一个数据集,其中x 代表一年中的某一天(比如生日),我想创建一个密度图。 此外,由于我有一些分组信息(比如男孩或女孩),我想使用ggplot2 的功能来制作密度图。

一开始很容易:

require(ggplot2); require(dplyr)
bdays <- data.frame(gender = sample(c('M', 'F'), 100, replace = T), bday = sample(1:365, 100, replace = T))
bdays %>% ggplot(aes(x = bday)) + geom_density(aes(color = factor(gender)))

但是,由于边缘效应,这给出的估计值很差。 我想应用我可以使用圆坐标的事实,以便 365 + 1 = 1 -- 12 月 31 日之后的一天是 1 月 1 日。 我知道circular 包提供了这个功能,但我没有成功使用stat_function() 调用实现它。 使用ggplot2 对我特别有用,因为我希望能够使用构面、aes 调用等。

另外,为了澄清,我想要看起来像 geom_density 的东西——我不是在寻找像 Circular density plot using ggplot2 所示的极坐标图。

【问题讨论】:

这是一个可能有用的really neat example,并尝试将其显示为圆形热图而不是密度。 【参考方案1】:

要消除边缘效应,您可以堆叠三个数据副本,创建密度估计值,然后仅显示中间数据副本的密度。这将保证密度函数从一侧到另一侧的“环绕”连续性。

下面是一个将您的原始情节与新版本进行比较的示例。我使用adjust 参数在两个绘图之间设置相同的带宽。另请注意,在循环版本中,如果您希望将密度加到 1,则需要重新归一化:

set.seed(105)
bdays <- data.frame(gender = sample(c('M', 'F'), 100, replace = T), bday = sample(1:365, 100, replace = T))

# Stack three copies of the data, with adjusted values of bday
bdays = bind_rows(bdays, bdays, bdays)
bdays$bday = bdays$bday + rep(c(0,365,365*2),each=100)

# Function to adjust bandwidth of density plot
# Source: http://***.com/a/24986121/496488
bw = function(b,x) b/bw.nrd0(x)

# New "circularized" version of plot
bdays %>% ggplot(aes(x = bday)) + 
  geom_density(aes(color = factor(gender)), adjust=bw(10, bdays$bday[1:100])) +
  coord_cartesian(xlim=c(365, 365+365+1), expand=0) +
  scale_x_continuous(breaks=seq(366+89, 366+365, 90), labels=seq(366+89, 366+365, 90)-365) +
  scale_y_continuous(limits=c(0,0.0016))
  ggtitle("Circularized")

# Original plot
ggplot(bdays[1:100,], aes(x = bday)) + 
  geom_density(aes(color = factor(gender)), adjust=bw(30, bdays$bday[1:100])) +
  scale_x_continuous(breaks=seq(90,360,90), expand=c(0,0)) +
  ggtitle("Not Circularized")

【讨论】:

解决了我的问题 - 几乎违反直觉的简单。

以上是关于ggplot2 圆形数据的密度的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2 堆叠直方图 - 转换为密度图

使用 ggplot2 从两个不同的数据帧创建密度图

R语言ggplot2可视化:ggplot2使用geom_mark_ellipse函数进行椭圆形圈定(注释)特定的数据簇或组(只为椭圆形圈定的数据集配置色彩)

在 ggplot2 中使用计数数据向直方图添加密度线

图例在 ggplot2 密度图中不显示线型

R语言ggplot2可视化:绘制堆叠的密度图(Stacked Area Chart)