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')