如何在R中创建类似色谱图的图表?

如何在R中创建类似色谱图的图表?,r,ggplot2,R,Ggplot2,我正试图用R创建一个图表,就像这样。描述中说这是一张色标图,但我在网上找不到创建这种类型图表的任何资源或示例 我有所有事件的时间和它们的类别,我唯一需要做的就是根据时间和日期绘制每个事件。我试图调整geom_lines()和geom_boxplot()之类的东西,但它们都给了我一个堆叠的条,而不是事件的分布。geom_points()可以实现接近我想要的效果,但它们都是点,而不是单线/条形 数据的一个例子是: Study Period Hour of day Event Day 1

我正试图用R创建一个图表,就像这样。描述中说这是一张色标图,但我在网上找不到创建这种类型图表的任何资源或示例

我有所有事件的时间和它们的类别,我唯一需要做的就是根据时间和日期绘制每个事件。我试图调整geom_lines()和geom_boxplot()之类的东西,但它们都给了我一个堆叠的条,而不是事件的分布。geom_points()可以实现接近我想要的效果,但它们都是点,而不是单线/条形

数据的一个例子是:

Study Period  Hour of day  Event
Day 1         7:00         Add an activity
Day 1         9:00         Delete an activity
Day 2         8:00         View timeline
Day 3         11:00        View timeline

..

您可以使用
geom\u纵横杆
实现这样的图表。首先,让我们制作一些类似于您的数据

我已经包括了一列
主题
,将事件标记为a-F,并假设所有时间戳的格式都与示例数据相同(H:M)

我们可以通过管道将结果传输到
ggplot
。请注意,在
stat\u summary
中,我们为
fun.y
fun.ymin
fun.ymax
提供了相同的值<这里使用的是code>max,但它可以是任何返回未更改的
decDay
值的函数

scale\u y\u reverse
与参数一起使用,以生成一个y轴,该y轴与问题中的示例图表类似

df1 %>% 
  mutate(D = as.numeric(gsub("Day ", "", Day)), 
         H = as.numeric(gsub(":00", "", Time)), 
         decDay = D + H/24) %>% 
  ggplot(aes(Subject, decDay)) + 
  stat_summary(geom = "crossbar", 
               fun.y = max, 
               fun.ymax = max, 
               fun.ymin = max, 
               aes(color = Event), 
               width = 0.8) + 
  scale_y_reverse(breaks = c(1, 28), 
                  labels = c("Day 1", "Day 28")) + 
  labs(y = "Study Period (Day 1-28)")
结果:


请提供一些纯文本格式的示例数据(使用例如
dput
),这样我们就可以使用了。@neilfws好的,我刚刚添加了。感谢您的提醒。看起来您可以使用
ggplot(一些数据,aes(参与者,日期时间,颜色=事件))+geom\u tile()+facet\u wrap(~SYSTEM)
。我建议您将
学习期间
一天中的小时
合并到一个数字列中,您是否可以像这里的日时间一样使用它们。@JonSpring您所说的“方面(~SYSTEM)”是什么意思?我认为facet_wrap(~)只是将绘图包装成多个子绘图的东西?也许
geom_tile(aes(参与者,日时间,填充=事件),宽度=1,高度=H)
。H的值取决于时间戳的频率和数字格式,因此,例如,如果y轴为POSIXct,并且希望槽口表示1小时秒,则H的值可能需要为3600。
df1 %>% 
  mutate(D = as.numeric(gsub("Day ", "", Day)), 
         H = as.numeric(gsub(":00", "", Time)), 
         decDay = D + H/24) %>%
  head()

  Subject Event    Day  Time  D  H   decDay
1       7     C Day 13  1:00 13  1 13.04167
2       3     B Day 19 12:00 19 12 19.50000
3       7     C Day 19  7:00 19  7 19.29167
4       7     A Day 27  5:00 27  5 27.20833
5       8     F Day 25 17:00 25 17 25.70833
6       7     C Day 20  0:00 20  0 20.00000
df1 %>% 
  mutate(D = as.numeric(gsub("Day ", "", Day)), 
         H = as.numeric(gsub(":00", "", Time)), 
         decDay = D + H/24) %>% 
  ggplot(aes(Subject, decDay)) + 
  stat_summary(geom = "crossbar", 
               fun.y = max, 
               fun.ymax = max, 
               fun.ymin = max, 
               aes(color = Event), 
               width = 0.8) + 
  scale_y_reverse(breaks = c(1, 28), 
                  labels = c("Day 1", "Day 28")) + 
  labs(y = "Study Period (Day 1-28)")