草庐IT

关于 r:重新排序箱线图中的列 ggplot2

codeneng 2023-03-28 原文

Reorder columns in boxplots ggplot2

我有这个箱线图,我想重新排列列。我想要 MCAR、MAR、MNAR 而不是 MAR、MCAR、MNAR。传说也是错误的,橙色是ymiss,蓝色是yobs,但我无法改变它。你能帮助我吗?谢谢!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
library(ggplot2)
logistic <- function(x) exp(x) / (1 + exp(x))
set.seed(80122)
n <- 300
dt <- MASS::mvrnorm(n = n, mu = c(0, 0),
                   Sigma = matrix(c(1, 0.5, 0.5, 1), nrow = 2));dt

r2.mcar <- 1 - rbinom(n, 1, 0.5);r2.mcar
r2.mar <- 1 - rbinom(n, 1, logistic(dt[, 1]));r2.mar
r2.mnar <- 1 - rbinom(n, 1, logistic(dt[, 2]));r2.mnar

yobs1<-dt
yobs1[r2.mcar==0,2]<-NA;yobs1
yobs2<-dt
yobs2[r2.mar==0,2]<-NA;yobs2
yobs3<-dt
yobs3[r2.mnar==0,2]<-NA;yobs3

dados<-matrix(cbind(yobs1[,1],yobs2[,1],yobs3[,1],yobs1[,2],yobs2[,2],yobs3[,2]),ncol=1)

v<-c(rep("yobs",900),rep("ymiss",900))
m<-c(rep("MCAR",300),rep("MAR",300),rep("MNAR",300))
dados<-data.frame(v,m,dados)
names(dados)<-c("y","mecanismo","valores")

p <- ggplot(dados, aes(x =valores, y = mecanismo)) +
  geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +
  scale_fill_manual(values = c("lightskyblue","lightsalmon"))
p + facet_grid(~mecanismo)


你的一个问题实际上是两个问题:

  • 改变刻面的顺序。 ggplot2 首先将 dados$mecanismo 中的数据更改为一个因子。方面的顺序与该因素的水平顺序有关,默认情况下,通常是它们在数据集中出现的顺序。要更改顺序,您需要将 dados$mecanismo 定义为数据框中的一个因素,然后还按特定顺序定义级别。

  • 将图例中的特定颜色分配给一个因素。在您的 scale_fill_manual 命令中,您正在分配 values=。默认情况下,值的顺序是根据因子水平的顺序应用的(在本例中为 dados$y)。您可以重新指定该因素的级别,但要专门分配颜色,您不需要。您需要做的就是提供一个 list(.. 或一个命名向量 c('name'='color', 'name2'='color2',..values= 来代替颜色向量。顺便说一句...您可以更改 ymissyobs 在图例中出现的顺序,方法是设置上面 #1 中所示的因子...

  • 这是代码和情节:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # relevel factor for right order of facets
    dados$mecanismo <- factor(dados$mecanismo, levels=c('MCAR','MAR','MNAR'))

    p <- ggplot(dados, aes(x =valores, y = mecanismo)) +
      geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +

      # set colors with named vector
      scale_fill_manual(values = c('yobs'="lightskyblue",'ymiss'="lightsalmon"))
    p + facet_grid(~mecanismo)

    编辑:更改图例键的顺序

    经过一些评论,很明显 OP 不仅打算根据 ymissyobs 的特定值重新着色数据,还打算更改图例中框的位置以匹配的情节。我的意思是,在上面的图中,yobs 的箱线图位于顶部,ymiss 位于下方,但在右侧的图例中,顺序颠倒了。解决此问题的方法是通过 scale_fill_manualbreaks= 参数显式指定标签的顺序。这解决并修复了该问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dados$mecanismo <- factor(dados$mecanismo, levels=c('MCAR','MAR','MNAR'))

    ggplot(dados, aes(x =valores, y = mecanismo)) +
      geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +
     
      # set colors with named vector
      scale_fill_manual(
        values = c('yobs'="lightskyblue",'ymiss'="lightsalmon"),
        breaks = c('yobs', 'ymiss')
      )

    • 谢谢你的帮助!它仍然是错误的,因为带有异常值的蓝色箱线图必须是橙色箱线图(ymiss)。传说是对的,唯一的问题是箱线图!
    • 好像和你原来的一样,对吧?顶部带有异常值的框是原始框和修改框的 yobs。图例的顺序与框的顺序不同 - 这就是你的意思吗?
    • 是的。我原来的盒子是对的,唯一错的是传说!现在唯一的问题是盒子!
    • 啊——现在很清楚了。是的,有一个简单的解决方案,它与解决 scale_fill_manual 中的 breaks= 参数有关。在答案中发布了编辑。
    • 抱歉又打扰了!我想我不是很清楚。那些有异常值的应该是 ymiss 而不是 yobs。在您的编辑中,图例是正确的,而方框是错误的..
    • 那里的问题是数据分配,而不是绘图的代码。在指定 v<-c(rep... 时,您的 ymissyobs 分配似乎不正确。应该先是ymiss,然后是yobs。


    添加此代码,它将起作用:

    1
    2
    3
    4
    5
    6
    7
    #Reorder var
    dados$mecanismo <- factor(dados$mecanismo,levels = c("MCAR","MAR","MNAR"),ordered = T)

    p <- ggplot(dados, aes(x =valores, y = mecanismo)) +
      geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +
      scale_fill_manual(values = c("lightsalmon","lightskyblue"))
    p + facet_grid(~mecanismo)

    • @Cludia123 太好了!我看到您正在处理缺少的数据机制,这是一个非常酷的话题。如果您对这个答案感到满意,请接受它:)
    • 现在唯一的错误是蓝色的应该是橙色的。它们被切换。具有异常值的是 ymiss 所以它应该是橙色的
    • 在这种情况下@Cludia123 尝试添加 scale_fill_manual(values = c(yobs=lightskyblue,ymiss=lightsalmon))

    有关关于 r:重新排序箱线图中的列 ggplot2的更多相关文章

    1. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    2. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

      我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

    3. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

      我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

    4. ruby-on-rails - 将 ruby​​ 数组转换为整齐的列字符串? - 2

      我是ruby​​的新手,我正在尝试制作一个程序来自动格式化给定的字符串和数组。我试图弄清楚的一种自动格式化功能是一种用于数组的功能。假设我有一个如下例所示的数组myArray=["a","b","c"]我想把它变成一个列化的字符串,这样putsmyString就会给出`1)a``2)b``3)c`我该怎么做呢?我能找到的最接近的东西是使用.each这不是我想要的,我不能让每一行都有一个单独的条目。这一切都必须是一个带有换行符的字符串。任何帮助将不胜感激,提前致谢 最佳答案 您可以使用.map与.with_index:myArray=

    5. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

      我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

    6. ruby - 将全局 $stdout 重新分配给控制台 - ruby - 2

      我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r

    7. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

      我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

    8. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

      我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

    9. ruby-on-rails - 关于 Ruby 的一般问题 - 2

      我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

    10. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

      我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

    随机推荐