【问题标题】:Plotting the distribution for multiple columns绘制多列的分布
【发布时间】:2020-03-19 14:14:30
【问题描述】:

我想绘制我的数据集多列的分布。它有超过 820.000 行和 18 列。我想绘制除带有虚拟变量的列之外的所有列。我已经能够创建一个图形。但我想在 y 轴上显示 x 轴的值,因为这些是列值,我想显示它们在每一列的分布。

1。路径的定义

setwd("C:/Users/A/Documents/Master BWL/Masterarbeit")

2。加载所需的包

library(factoextra); library(cluster); library(skmeans); library(mclust); 
library(fpc); library(psda); library(simEd); library (ggpubr);
library(dbscan); library(clustertend); library(MASS); library(devtools);
library(ggbiplot);library(NbClust); library(clValid); library(plotrix)
library(graphics); library(reshape2)

3。导入csv文件

WKA_ohneJB <- read.csv("WKA_ohneJB_PCA.csv", header=TRUE, sep = ";",  stringsAsFactors = FALSE)

4 选择列

WKA_ohneJB2 <- c(WKA_ohneJB[, "BASKETS_NZ"], WKA_ohneJB[, "PIS"],  WKA_ohneJB[, "PIS_AP"],
             WKA_ohneJB[, "PIS_DV"], WKA_ohneJB[, "PIS_PL"], WKA_ohneJB [, "PIS_SDV"],
            WKA_ohneJB[, "PIS_SHOPS"], WKA_ohneJB[,"PIS_SR"], WKA_ohneJB[, "QUANTITY"]

)

df <- melt(WKA_ohneJB2)

5 情节

ggplot(df) + 
geom_col(aes(x= WKA_ohneJB2 , y=value)) 

这是我到目前为止生成的情节。

这是我的数据集的一部分:

dput(rbind(head(WKA_ohneJB, 10), tail(WKA_ohneJB, 10)))
structure(list(X = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
821039L, 821040L, 821041L, 821042L, 821043L, 821044L, 821045L, 
821046L, 821047L, 821048L), BASKETS_NZ = c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
LOGONS = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), PIS = c(71L, 39L, 50L, 4L, 
13L, 4L, 30L, 65L, 13L, 31L, 111L, 33L, 3L, 46L, 11L, 8L, 
17L, 68L, 65L, 15L), PIS_AP = c(14L, 2L, 4L, 0L, 0L, 0L, 
1L, 0L, 2L, 1L, 13L, 0L, 0L, 2L, 1L, 0L, 3L, 8L, 0L, 1L), 
PIS_DV = c(3L, 19L, 4L, 1L, 0L, 0L, 6L, 2L, 2L, 3L, 38L, 
8L, 0L, 5L, 2L, 0L, 1L, 0L, 3L, 2L), PIS_PL = c(0L, 5L, 8L, 
2L, 0L, 0L, 0L, 24L, 0L, 6L, 32L, 8L, 0L, 0L, 4L, 0L, 0L, 
0L, 0L, 0L), PIS_SDV = c(18L, 0L, 11L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 6L, 0L, 0L, 13L, 0L, 0L, 1L, 15L, 1L, 0L), PIS_SHOPS = c(3L, 
24L, 13L, 3L, 0L, 0L, 6L, 28L, 2L, 11L, 71L, 16L, 2L, 5L, 
6L, 0L, 1L, 0L, 3L, 2L), PIS_SR = c(19L, 0L, 14L, 0L, 0L, 
0L, 2L, 23L, 0L, 3L, 6L, 0L, 0L, 20L, 0L, 0L, 3L, 32L, 1L, 
0L), QUANTITY = c(13L, 2L, 18L, 1L, 14L, 1L, 4L, 2L, 5L, 
1L, 5L, 2L, 2L, 4L, 1L, 3L, 2L, 8L, 17L, 8L), WKA = c(1L, 
1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 0L, 1L, 1L), NEW_CUST = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), EXIST_CUST = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), WEB_CUST = c(1L, 0L, 0L, 0L, 1L, 1L, 0L, 
1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), MOBILE_CUST = c(0L, 
1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 1L, 0L), TABLET_CUST = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L), 
LOGON_CUST_STEP2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 821039L, 821040L, 821041L, 
821042L, 821043L, 821044L, 821045L, 821046L, 821047L, 821048L

), class= "data.frame")

6 绘制直方图

var_to_plot = c("BASKETS_NZ","PIS","PIS_AP","PIS_DV","PIS_PL","PIS_SDV", "PIS_SHOPS","PIS_SR", "QUANTITY") 标准杆(mfrow=c(3,3)) for(i in var_to_plot){hist(WKA_ohneJB[,i],xlab=i,main="")}

我创建了几个直方图。但是轴的缩放是错误的。我希望 x 轴的数值出现在 y 轴上,y 轴的数值出现在 x 轴上。这是如何运作的?我还希望值完全显示,而不是 e^。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您无需重新组合数据框。您需要的是密度图或直方图。

    作为一个好的做法,只加载绘图所需的包,在这种情况下可能是 ggplot2 和 tidyr。

    例如,我刚刚使用了一个示例,其中包含我可以在您的数据中看到的 5 个列名:

    library(tidyr)
    library(ggplot2)
    
    WKA_ohneJB = data.frame(dummyvar=1:10000,sapply(1:5,rnorm,n=10000))
    colnames(WKA_ohneJB)[-1] = c("BASKETS_NZ","PIS","PIS_AP","PIS_DV","PIS_PL")
    head(WKA_ohneJB)
    
      dummyvar  BASKETS_NZ       PIS   PIS_AP   PIS_DV   PIS_PL
    1        1  0.92088518 0.9167877 1.956920 4.695379 4.349631
    2        2  0.05335686 2.8225161 3.059749 4.317281 5.985579
    3        3  1.00141759 3.5743033 2.499662 4.761415 5.886588
    4        4 -1.31231486 2.5335004 5.396917 4.364643 5.866026
    5        5 -0.65336724 0.2647117 3.203358 4.838659 4.437011
    6        6  0.78769080 0.3630670 2.516433 3.826074 3.741611
    

    对其中一个做:

    ggplot(WKA_ohneJB,aes(x=PIS)) + geom_histogram()
    

    或者:

    ggplot(WKA_ohneJB,aes(x=PIS)) + geom_density()
    

    要一次性绘制所有内容,您可以尝试将其旋转很长时间,就像您对熔化所做的那样,但我不知道您的机器是否可以处理它,因此请先尝试一些变量:

    var_to_plot = c("BASKETS_NZ","PIS","PIS_AP","PIS_DV","PIS_PL")
    dummyvar = "dummyvar"
    ggplot(pivot_longer(WKA_ohneJB[,c(var_to_plot,dummyvar)],-dummyvar),
    aes(x=value)) +
    geom_histogram() +
    facet_wrap(~name)
    

    如果熔化 data.frame 过于密集,只需使用 baseR plot:

    # means 2 rows, 3 columns
    par(mfrow=c(2,3))
    for(i in var_to_plot){hist(WKA_ohneJB[,i],xlab=i,main="")}
    

    【讨论】:

    • @StupidWolf 这太棒了。感谢您的帮助。
    • @StupidWolf 你能解释一下这段代码吗:par(mfrow=c(2,3)) for(i in var_to_plot){hist(WKA_ohneJB[,i],xlab=i,main=" “)} 详细地?尤其是两行三列。两行三列分别指的是哪些值?
    • 如果您在 R 中使用绘图功能,它会每次在设备上刷新。因此,如果您想在同一设备屏幕上制作多个绘图,您可以执行 par(mfrow=c(2,3)) ; 2 表示 2 行,3 表示 3 列.. 就像你预期的 6 个地块
    • 如果你喜欢 par(mfrow=c(4,4)) 你期待 16 个地块,4 行 4 列 statmethods.net/advgraphs/layout.html
    • @StupidWolf 我在您的代码之后绘制了 9 个图。但是轴的缩放是错误的。请参阅上面的#6 绘制直方图。
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2021-06-12
    • 2022-01-19
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2022-06-22
    • 2020-09-16
    相关资源
    最近更新 更多