由于这是我在这里的第一个帖子,所以请原谅我在这篇文章中遇到的任何问题;不过,请随意留下建设性的批评意见.

下面的代码使用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))

enter image description here

我try 在geom_col()中使用width参数,并在aes()中包含width = Total_In_Class,但这两种方法都不起作用.

推荐答案

我找到了两种方法:


首先,这里描述的是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))

geom_col with variable width

请注意width美学.除以的数字应该将结果数字zoom 到0到1之间,因为这在一定程度上是在x轴以下标签的间距范围内.如果width是百分之一,那么所有x轴的刻度都将被curl 到中间的一个看似单一的点中,因为它们的距离(1-ish)相对于矩形的宽度(width-ish)很小.


但是,尽管如此,我对结果还是不太满意.这不是我们想要的,对吧?我们希望相邻的矩形整齐地排列.我发现这种情节叫mosaic plot.我喜欢把它们想象成具有公制x and y美学映射的矩形,例如它们的面积同时显示了关于两个变量的东西.在版本A geom_col只能有一个度量映射的情况下,另一个必须是绝对的.

而ggploy则有ggmosaic个.关键区别是:我们不能输入已有tally()个数据,因为它在内部进行计数(就像geom_bar可以做的那样).因此,我们将回到最初的泰坦尼克号数据集.

首先,演示更"成比例"的矩形:(从字面上取自?geom_mosaic个帮助示例).

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

mosaic plot of titanic class and survival counts

这是更复杂的版本,包含了您要求的所有可能的分类组合.在熟悉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))

enter image description here

为了更多地回到您最初提出的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))

ggmosaic chart of all titanic classification combinations, fill = sex

这是我最喜欢的,因为它实现了我想象中的你想要的结果.我想你想用Survival_Percentage * Total_In_Class来把幸存者的数量想象成wine 吧的面积.

百分比不再是必需的,因为number of survived * Total_in_Class为我们提供了与上面相同的相对比例,这将变为可见的矩形区域.

R相关问答推荐

从字符载体创建函数参数

基于shiny 应用程序中的日期范围子集xts索引

R创建一个数据透视表,计算多个组的百分比

根据R中两个变量的两个条件删除带有dspirr的行

在使用ggroove后,将图例合并在gplot中

获取列中值更改的行号

如何直接从Fortran到R的数组大小?

如何优化向量的以下条件赋值?

R中的时间序列(Ts)函数计数不正确

无法正确设置动态创建的Quarto标注的格式

用约翰逊分布进行均值比较

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

扩展R中包含列表的数据框

使用geom_iles在一个切片中包含多个值

为什么这个表格格罗布不打印?

带RStatix的Wilcoxon环内检验

R:如何在数据集中使用Apply

基于R中的引用将向量值替换为数据框列的值