【问题标题】:How to Reorder X-Axis Clustering in ggplot Bar-Chart如何在 ggplot 条形图中重新排序 X 轴聚类
【发布时间】:2020-11-05 18:35:11
【问题描述】:

R 专家下午好,

我正在用 R 制作一个相当复杂的条形图,我很难在我的图表中重新组织集群。具体来说,所有的控制值和病变值都分别聚类,如下所示:

我希望它们在每篇论文和任务中并排排列,而不是在每个方面单独聚集控制和损伤条件。这应该会导致 Control 和 Lesion 标签重复多次,我不知道该怎么做。我用来实现此条形图的代码如下:

p10 <- ggplot(cbmeta_new1, 
              aes(x = Condition, y = Proportion, fill = Task, alpha = Paper)) +   
  geom_bar(stat = 'identity', position = 'dodge', colour='black') + 
  facet_grid(~  Type) +
  scale_alpha_discrete()

有人可以建议我如何编辑上述脚本以实现所需的格式吗?提前感谢您的时间和考虑!

以下是一些示例数据:

Example Data

dput(cbmeta_new[1:10, ])
structure(list(Paper = structure(c(1L, 2L, 2L, 2L, 2L, 4L, 5L, 
3L, 3L, 6L), .Label = c("Cattaneo et al., 2012", "Clausi et al., 
2019", 
"Gerschcovich et al., 2011", "Hoche et al., 2016", "Roca et al., 
2013", 
"van Harskamp et al., 2005", "van Overwalle et al., 2019"), class = 
"factor"), 
Type = structure(c(2L, 1L, 3L, 4L, 4L, 1L, 4L, 1L, 4L, 4L
), .Label = c("Perceptual", "Sequencing", "Emotion Attribution", 
"Verbal Vignette", "Other"), class = "factor"), Task = structure(c(1L, 
9L, 3L, 5L, 12L, 9L, 5L, 9L, 5L, 12L), .Label = c("Bio Action Obs", 
"Causal Attribution", "Emot Attribution", "False Belief", 
"Faux Pas", "Gravity", "Mechanical", "Norm Behavior", "RMET", 
"Sequencing", "Social Script", "ToM", "Trait Attribution", 
"Violations"), class = "factor"), Condition = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Control", 
"Lesion"), class = "factor"), Proportion = c(0.8875, 0.73, 
0.71, 0.78, 0.95, 0.7632, 0.91, 0.829444444, 0.95, 0.986428571
)), row.names = c(NA, 10L), class = "data.frame")

抱歉,我是这个网站的新手,仍在探索如何最好地发布这些帖子。

亲切的问候, 琳达

【问题讨论】:

  • 您能否添加数据,以便我们有一个最小的可重现示例?这样人们就可以操纵它,并且更有可能找到解决问题的方法。
  • 如果您能提供一些数据以使您的代码可重现,这将更容易为您提供帮助,请参见此处:stackoverflow.com/q/5963269/6240490
  • 听起来您不想在 x 轴上显示 Condition。听起来您想要在 x 轴上组合 PaperTask - 或者可能是纸张、任务和条件。这可以通过为 x 轴创建一个新变量来实现纸张、任务和条件的独特组合。但是如果没有一些样本数据,我们真的无能为力。 dput() 是共享示例数据的最佳方式,例如前 10 行的 dput(cbmeta_new1[1:10, ])。选择一个小的子集来说明问题 - 可能只是前两个方面。
  • @GregorThomas 感谢您的周到反馈。我已根据您的要求使用一些示例数据编辑了我的帖子。如果您需要任何进一步的信息,请随时告诉我!
  • @luismf 您好,非常感谢您的反馈!我只是包含了一些示例数据。我希望这是有帮助的。如果您需要任何进一步的信息,请告诉我。

标签: r ggplot2 graphing


【解决方案1】:

您的示例数据仅包含“控制”条件,并且每个“类型”仅包含一项任务。我通过从 Control 中减去一个常量添加了一个虚拟“Lesion”-Condition,并通过使用新名称回收每个任务来为每种类型添加第二个虚拟任务。

#add Lesion Condition
cbmeta_new1 <- rbind(cbmeta_new1, 
                     transform(cbmeta_new1, Condition = "Lesion",
                               Proportion = cbmeta_new1$Proportion - 0.2))

#add second task for each type
cbmeta_new1 <- rbind(cbmeta_new1,
                     transform(cbmeta_new1, Task = paste0(substr(cbmeta_new1$Task, 1, 3), "2")))

听起来您需要条件、任务和纸张的组合来确定条在 x 轴上的位置。一种方法是使用 interaction() 创建一个新变量,其中包含这些变量的所有组合。

然后您可以手动指定您想要在 x 轴上使用的标签。在这里,我进行了设置,以便仅显示 Condition 的标签(Control vs Lesion),而 Task 和 Paper 由 fillalpha 标识,如您的原始图所示。

#variable for position on x-axis
cbmeta_new1$xpos1 <- with(cbmeta_new1, 
                         interaction(Condition, Paper, Task, drop = TRUE))

#Labels on x-axis (condition only)
xlabs1 <- rep(c("Control", "Lesion"), length(levels(cbmeta_new1$xpos)))

#plot
ggplot(cbmeta_new1, 
       aes(x = xpos1, y = Proportion, fill = Task, alpha = Paper)) +   
  geom_bar(stat = "identity", colour = "black", ) + 
  facet_grid(. ~  Type, scale = "free_x") +
  scale_alpha_discrete() +
  scale_x_discrete(name = "", labels = xlabs1)+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

我发现 alpha 级别对区分论文没有用处。更好的解决方案可能是将纸质标签放在 x 轴上并使用 alpha 作为条件。当您还可以按条件对条形进行分组时(对于任务和论文的每种组合)。原理和之前一样:(a) 创建一个变量来定义 x 位置 (b) 定义在 x 轴上显示哪些标签。在这种情况下,我只显示论文。条件和任务由 alpha 和颜色定义。为了创建 x-labels,我编写了一个自定义函数,该函数从 xpos2 变量的级别中提取论文名称。可能有一种更直接的方法可以做到这一点,但这说明了总体思路。

#variable for position on x-axis
cbmeta_new1$xpos2 <- with(cbmeta_new1, interaction(Paper, Task, drop = TRUE))

##Labels on x-axis (paper only)
xlabs2 <- sapply(levels(cbmeta_new1$xpos2), FUN = function(x) {
  x = sub(pattern = "et al.", replacement = "et al", x)
  x = sub(pattern = "\n", replacement = "", x)
  x = strsplit(x, split = ".", fixed = TRUE)[[1]]
  return(x[1])
})

#plot
ggplot(cbmeta_new1, 
       aes(x = xpos2, y = Proportion, fill = Task, alpha = Condition)) +   
  geom_bar(aes(group = Condition), stat = "identity", colour = "black", 
           position = "dodge") + 
  facet_grid(. ~  Type, scale = "free_x") +
  scale_alpha_discrete() +
  scale_x_discrete(name = "", labels = xlabs2) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

另一种选择可能是使用嵌套方面(例如,任务嵌套在类型中)。例如,请参见此处:https://stackoverflow.com/a/58037287/6240490。或者您可以通过例如为每个“类型”创建单独的图然后自己安排它们来简化事情,例如使用拼凑包 (https://github.com/thomasp85/patchwork)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 2019-03-10
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多