首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环到用ggplot绘制盒图。

循环到用ggplot绘制盒图。
EN

Stack Overflow用户
提问于 2020-11-02 23:53:43
回答 1查看 261关注 0票数 0

我用的是钻石df

我想为每个数字列逐个类别绘制一个盒子图,在这种情况下,类别将被定义为“剪切”列。

我用一个for循环来完成这个任务,

下面是我使用的代码:

代码语言:javascript
运行
复制
##################################################################################
#                              Data                                              #
#                                                                                #
##################################################################################

data("diamonds")
basePlot <- diamonds[ names(diamonds)[!names(diamonds) %in% c("color", "clarity")] ]

##################################################################################

## set Plot view to 4 boxplots ##
par(mfrow = c(2,2))

## for-loop to boxplot all numerical columns ##

for (i in 1:(ncol(basePlot)-1)){
  print(ggplot(basePlot, aes(as.factor(cut), 
  basePlot[c(i)],color=as.factor(cut)))
        + geom_boxplot(outlier.colour="black",outlier.shape=16,outlier.size=1,notch=FALSE)
        + xlab("Diamond Cut")
        + ylab(colnames(basePlot)[i])
  )
}

控制台输出:

代码语言:javascript
运行
复制
Don't know how to automatically pick scale for object of type data.frame. Defaulting to continuous.
Error in is.finite(x) : default method not implemented for type 'list'

还有其他方法来完成这个任务吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-03 04:09:40

而不是多个情节,我建议多个方面。但是,要做到这一点,我们需要将数据从"wide“格式转换为"longer”格式,而tidyverse的规范方式是使用tidyr::pivot_longer

代码语言:javascript
运行
复制
> basePlot
# A tibble: 53,940 x 8
   carat cut       depth table price     x     y     z
   <dbl> <ord>     <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal      61.5    55   326  3.95  3.98  2.43
 2 0.21  Premium    59.8    61   326  3.89  3.84  2.31
 3 0.23  Good       56.9    65   327  4.05  4.07  2.31
 4 0.290 Premium    62.4    58   334  4.2   4.23  2.63
 5 0.31  Good       63.3    58   335  4.34  4.35  2.75
 6 0.24  Very Good  62.8    57   336  3.94  3.96  2.48
 7 0.24  Very Good  62.3    57   336  3.95  3.98  2.47
 8 0.26  Very Good  61.9    55   337  4.07  4.11  2.53
 9 0.22  Fair       65.1    61   337  3.87  3.78  2.49
10 0.23  Very Good  59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows
> pivot_longer(basePlot, -cut, names_to="var", values_to="val")
# A tibble: 377,580 x 3
   cut     var      val
   <ord>   <chr>  <dbl>
 1 Ideal   carat   0.23
 2 Ideal   depth  61.5 
 3 Ideal   table  55   
 4 Ideal   price 326   
 5 Ideal   x       3.95
 6 Ideal   y       3.98
 7 Ideal   z       2.43
 8 Premium carat   0.21
 9 Premium depth  59.8 
10 Premium table  61   
# ... with 377,570 more rows

在这种情况下,我们只需要告诉ggplot2要担心值的val,以及x轴的var

代码语言:javascript
运行
复制
library(ggplot2)
library(tidyr) # pivot_longer

ggplot(pivot_longer(basePlot, -cut, names_to="var", values_to="val"),
       aes(cut, val, color=cut)) +
  geom_boxplot(outlier.colour="black", outlier.shape=16, outlier.size=1, notch=FALSE) +
  xlab("Diamond Cut") +
  facet_wrap(~var, nrow=2, scales="free") +
  scale_x_discrete(guide=guide_axis(n.dodge=2))

在x轴和图例中都有cut是因为color=会添加图例。因为它是多余的,我们可以删除颜色美学(这也将删除图例)或我们可以只是抑制图例(通过添加+ scale_color_discrete(guide=FALSE))。

有两种面向方式:facet_wrapfacet_grid。后者适用于多个变量( x上的一个面变量,y上的一个)和许多其他配置。当然,您可以只对一个变量使用facet_grid (类似于facet_wrap(nrow=1)ncol=1),但它们之间有一些样式上的区别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64654923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档