R语言 ggplot()+ geom_col():使用变量确定列宽

gt0wga4j  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(151)

请原谅这篇文章中的任何问题,因为这是我在这里的第一篇文章;尽管如此,请留下建设性的批评。
下面的代码使用ggmosaic包中的titanic数据制作了一个条形图,这是我正在制作的其他东西的一个示例,我不想分享。
我试图弄清楚如何编辑列的宽度以匹配Total_In_Class变量,是否有一种方法可以做到这一点?或者我应该创建一个不同的信息可视化?

library(tidyverse)
library(ggmosaic)

titanic %>%
  group_by(Class, Sex, Age, Survived) %>%
  tally() %>%
  spread(key = Survived, value = n, fill = 0) %>%
  mutate(Classification = paste("Class: ", Class, " Sex: ", Sex, " Age: ", Age)) %>%
  mutate(Total_In_Class = Yes + No) %>%
  mutate(Percent_Survived = Yes / Total_In_Class) %>%
  ggplot() +
  geom_col(aes(x = Classification, y = Percent_Survived)) + 
  geom_text(aes(x = Classification, y = Percent_Survived, label = Total_In_Class), vjust = -.3) +
  theme(axis.text.x = element_text(angle = -90, vjust = -.05))

字符串
x1c 0d1x的数据
我试过在geom_col()中使用width参数,以及在aes()中包含width = Total_In_Class,但这两种方法都不起作用。

izkcnapc

izkcnapc1#

我发现了两种方法:
首先,这里描述了geom_col版本:Is it possible to have variable width of bars in geom_col?

# Let df be the output of you data wrangling pipe

ggplot(df, aes(x = Classification, 
               y = Percent_Survived, 
               width = Total_In_Class/600)) +
  geom_col() +
  theme(axis.text.x = element_text(angle = -90, vjust = -.05))

字符串
x1c 0d1x的数据
请注意width的美学。您除以的数字应该将结果数字缩放到0和1之间的某个值,因为这在一定程度上是x轴下方标签间隔的距离尺度。如果width是数百个,则所有x轴刻度将被卷积为中间的一个看似单一的点,因为它们的距离(1-ish)相对于矩形的宽度(100-ish)很小。
但是,我仍然对结果不太满意,这不是我们想要的,对吗?我们希望相邻的矩形整齐排列。我发现这种图被称为 * 马赛克图 *。我喜欢把它们想象成具有度量x * 和 * y美学Map的矩形,例如,它们的区域同时显示了两个变量,其中geom_col只能有一个度量Map,另一个必须是分类的。
对于ggplot,有ggmosaic。关键的区别:我们不能输入已经tally() ied的数据,因为它在内部进行计数(就像geom_bar会做的那样)。所以我们要回到原始的titanic数据集。
首先,一个更“成比例”的矩形的演示:(这是从?geom_mosaic帮助示例中提取的)。

library(ggmosaic)
ggplot(titanic) +
  geom_mosaic(aes(x = product(Class), fill = Survived))



这是一个更复杂的版本,包含了您要求的所有可能的分类组合。在熟悉ggmosaic之后,可能需要进行一些微调,例如将一个因子(例如Age)移动到一个名为conds = Age的单独美学中。

ggplot(titanic) +
  geom_mosaic(aes(x = product(Class, Sex, Age), fill = Survived)) +
  # Add rotated x-axis labels for legibility
  theme(axis.text.x = element_text(angle = -90, vjust = -.05))



为了回到你最初提出的reprex问题的方向,我们可以将ggmosaic和你创建的Classification变量一起使用。

titanic %>%
  mutate(Classification = paste("Class: ", Class, " Sex: ", Sex, " Age: ", Age)) %>%
ggplot() +
  geom_mosaic(aes(x = product(Classification), fill = Survived)) +
  # rotate x axis labels
  theme(axis.text.x = element_text(angle = -90, vjust = -.05))

这是我最喜欢的,因为它实现了我想象的你想要的结果。我想你想用Survival_Percentage * Total_In_Class来可视化幸存者的数量作为酒吧的面积。
百分比不再是必要的,因为number of survived * Total_in_Class给出了与上面相同的相对比例,它作为矩形区域可见。

相关问题