R ggplot2:汇总行的独立连续填写&;纵队

R ggplot2:汇总行的独立连续填写&;纵队,r,ggplot2,R,Ggplot2,我正在使用一种策略,使用geom_tile在热图中绘制摘要(总计)行,这涉及到在数据框中为行和列总计创建额外的行: library(dplyr) library(ggplot2) entitites = LETTERS[1:10] # create some sample data df_foo = bind_cols( data_frame(Group1 = rep(c("A", "B"), each = 100)), bind_rows( expand.grid(

我正在使用一种策略,使用
geom_tile
在热图中绘制摘要(总计)行,这涉及到在
数据框中为行和列总计创建额外的行:

library(dplyr)
library(ggplot2)    

entitites = LETTERS[1:10]
# create some sample data
df_foo = bind_cols(
  data_frame(Group1 = rep(c("A", "B"), each = 100)),
  bind_rows(
    expand.grid(
      Left = entitites, Right = entitites,
      stringsAsFactors = FALSE
    ),
    expand.grid(
      Left = entitites, Right = entitites,
      stringsAsFactors = FALSE
    )
  ),
  data_frame(Value = rpois(200, 15))
)

# create the summary row & column
df_foo_aug = bind_rows(
  df_foo,
  df_foo %>% 
    group_by(Left, Group1) %>% 
    summarize(
      Value = sum(Value),
      Right = "Total"
    ),
  df_foo %>% 
    group_by(Right, Group1) %>% 
    summarize(
      Value = sum(Value),
      Left = "Total"
    )
)

# create the plot
df_foo_aug %>% 
  ggplot(aes(x = Right, y = Left, fill = Value)) + 
  geom_tile() + 
  facet_wrap(~ Group1) + 
  theme_bw()
这将产生:

显然,总计行/列需要自己的填充渐变,但不清楚如何(如果)添加第二个连续/渐变填充


实现同样预期结果的任何其他方法也可以作为解决这一问题的办法

这里的问题是,在
ggplot
中,美学原则上只能有一个尺度。所以
fill
只能有一个刻度。但是,有一些方法可以避免这种情况,例如使用
颜色
作为第二个刻度。或者,你也可以按照下面的建议,与一些低级职员混在一起完成工作

以下是一些可能的示例,使用
geom_point
显示总计:

base_plot <-  
  ggplot(df_foo_aug, aes(x = Right, y = Left)) + 
  geom_tile(data = filter(df_foo_aug, Right != 'Total', Left != 'Total'), 
            aes(fill = Value)) +
  coord_equal() +
  facet_wrap(~ Group1) + 
  scale_y_discrete(limits = rev(sort(unique(df_foo_aug$Left)))) +
  theme_classic() + theme(strip.background = element_blank())

使用感知范围更广的色阶:

base_plot +
  geom_point(data = filter(df_foo_aug, Right == 'Total' | Left == 'Total'), 
            aes(col = Value), size = 9.2, shape = 15) +
  viridis::scale_fill_viridis(option = 'B') +
  viridis::scale_color_viridis('Total', option = 'D')

还将
大小
映射到总

base_plot +
  geom_point(data = filter(df_foo_aug, Right == 'Total' | Left == 'Total'), 
             aes(col = Value, size = Value)) +
  scale_size_area(max_size = 8, guide = 'none') +
  viridis::scale_fill_viridis(option = 'B') +
  viridis::scale_color_viridis('Total', option = 'D')

就我个人而言,我非常喜欢最后一个


最后一个改进是向上移动y轴,我建议使用。

对象“entities”未找到。
@Axeman添加了
实体的定义。
.A这可能对您有用。(+1)原则上,这是一个非常好的答案——我非常感谢。然而,有一些细节(我认为不应该包括在内)使得这个解决方案对于我的问题来说不够通用
coord_equal
在我的案例中不可能使用(x&y轴上的不对称类别),这使得
shape=15的使用变得丑陋。如果通过使用默认点形状来避免此问题,则无法拟合给出point.PS内实际值的
geom_文本。我更愿意在你建立的框架内工作,而不是像@shayaa的答案中所说的那样胡闹。我真的无法帮助你了解我不知道的细节。不对称并不一定意味着不能使用
coord_equal
。您可以在当前总计之外创建一个额外的列/行,以适合文本。确定。我在补充这些细节——耐心是一种美德。:-)
base_plot +
  geom_point(data = filter(df_foo_aug, Right == 'Total' | Left == 'Total'), 
             aes(col = Value, size = Value)) +
  scale_size_area(max_size = 8, guide = 'none') +
  viridis::scale_fill_viridis(option = 'B') +
  viridis::scale_color_viridis('Total', option = 'D')