在R中绘制一个二元到多个因子

时间:2015-01-06 09:28:14

标签: r data-visualization ggplot2

首先,我还是初学者。我正在尝试用R解释并绘制一个堆栈条形图。我已经看过一些答案,但有些不是我的案例和其他我不明白的事情:

我有一个数据集dvl,它有五列,Variant,Region,Time,Person和PrecededByPrep。我想对Variant与其他四个预测变量进行多变量比较。每列可以有两个可能的值之一:

  • 变体:elkieder
  • 地区= VLNL
  • 时间:timeno time
  • 人:personno person
  • PrecededByPrep:10

这是逻辑回归

从我收集到的答案中,图书馆ggplot2可能是最好的绘图库。我已经阅读了它的文档,但是对于我的生活,我无法弄清楚如何绘制这个:我怎样才能将Variant与其他三个因素进行比较?

我花了一段时间,但我在Photoshop中做了类似于我想要的东西(虚构的价值观!)。

graph

深灰色/浅灰色:Variant的可能值 y轴:频率 x轴:每列,细分为可能的值

我知道制作单独的条形图both stacked and grouped,但基本上我不知道如何堆叠,分组条形图。可以使用ggplot2,但如果可以在没有我喜欢的情况下完成。

我认为这可以看作是一个样本数据集,但我并不完全确定。我是R的初学者,我读到了关于创建样本集的信息。

t <- data.frame(Variant = sample(c("iedere","elke"),size = 50, replace = TRUE),
            Region = sample(c("VL","NL"),size = 50, replace = TRUE),
            PrecededByPrep = sample(c("1","0"),size = 50, replace = TRUE),
            Person = sample(c("person","no person"),size = 50, replace = TRUE),
            Time = sample(c("time","no time"),size = 50, replace = TRUE))

我希望这个情节在审美上也是令人愉悦的。我的想法:

  • 绘制颜色(即条形图):col=c("paleturquoise3", "palegreen3")
  • 轴标签的加粗字体font.lab=2,但不是的值标签(例如'region in bold, but VL and NL`不是粗体)< / LI>
  • #404040作为字体,轴和线条的颜色
  • 轴的标签:x:factors,y:frequency

3 个答案:

答案 0 :(得分:6)

这是一种可能性,从未列表的&#39;开始。数据框melt,使用geom_bar中的ggplot2绘制(每组进行计数),使用facet_wrap按变量分隔绘图。

创建玩具数据:

set.seed(123)
df <- data.frame(Variant = sample(c("iedere", "elke"), size = 50, replace = TRUE),
           Region = sample(c("VL", "NL"), size = 50, replace = TRUE),
           PrecededByPrep = sample(c("1", "0"), size = 50, replace = TRUE),
           Person = sample(c("person", "no person"), size = 50, replace = TRUE),
           Time = sample(c("time", "no time"), size = 50, replace = TRUE))

重塑数据:

library(reshape2)
df2 <- melt(df, id.vars = "Variant")

简介:

library(ggplot2)
ggplot(data = df2, aes(factor(value), fill = Variant)) +
  geom_bar() +
  facet_wrap(~variable, nrow = 1, scales = "free_x") +
  scale_fill_grey(start = 0.5) +
  theme_bw()

enter image description here

有很多机会可以自定义图表,例如setting order of factor levelsrotating axis labelswrapping facet labels on two lines(例如,对于较长的变量名称&#34; PrecededByPrep&#34;)或者changing spacing between facets

自定义(有问题的更新和OP的评论)

# labeller function used in facet_grid to wrap "PrecededByPrep" on two lines
# see http://www.cookbook-r.com/Graphs/Facets_%28ggplot2%29/#modifying-facet-label-text
my_lab <- function(var, value){
  value <- as.character(value)
    if (var == "variable") { 
      ifelse(value == "PrecededByPrep", "Preceded\nByPrep", value)
    }
}

ggplot(data = df2, aes(factor(value), fill = Variant)) +
  geom_bar() +
  facet_grid(~variable, scales = "free_x", labeller = my_lab) + 
  scale_fill_manual(values = c("paleturquoise3", "palegreen3")) + # manual fill colors
  theme_bw() +
  theme(axis.text = element_text(face = "bold"), # axis tick labels bold 
        axis.text.x = element_text(angle = 45, hjust = 1), # rotate x axis labels
        line = element_line(colour = "gray25"), # line colour gray25 = #404040
        strip.text = element_text(face = "bold")) + # facet labels bold  
  xlab("factors") + # set axis labels
  ylab("frequency")

enter image description here

向每个栏添加计数(从OP编辑以下评论)。

计算y坐标的基本原则可以在this Q&A中找到。在这里,我使用dplyr计算每个柱的计数(即label中的geom_text)及其y坐标,但这当然可以在base R中完成,plyrdata.table

# calculate counts (i.e. labels for geom_text) and their y positions.
library(dplyr)
df3 <- df2 %>%
  group_by(variable, value, Variant) %>%
  summarise(n = n()) %>%
  mutate(y = cumsum(n) - (0.5 * n))

# plot
ggplot(data = df2, aes(x = factor(value), fill = Variant)) +
  geom_bar() +
  geom_text(data = df3, aes(y = y, label = n)) +
  facet_grid(~variable, scales = "free_x", labeller = my_lab) + 
  scale_fill_manual(values = c("paleturquoise3", "palegreen3")) + # manual fill colors
  theme_bw() +
  theme(axis.text = element_text(face = "bold"), # axis tick labels bold 
        axis.text.x = element_text(angle = 45, hjust = 1), # rotate x axis labels
        line = element_line(colour = "gray25"), # line colour gray25 = #404040
        strip.text = element_text(face = "bold")) + # facet labels bold  
  xlab("factors") + # set axis labels
  ylab("frequency")

enter image description here

答案 1 :(得分:6)

这是我对基础R的函数barplot的解决方案的提议:

<强> 1。计算计数

l_count_df<-lapply(colnames(t)[-1],function(nomcol){table(t$Variant,t[,nomcol])})
count_df<-l_count_df[[1]]
for (i in 2:length(l_count_df)){
    count_df<-cbind(count_df,l_count_df[[i]])
}

<强> 2。绘制没有轴名称的条形图,保存条形坐标

par(las=1,col.axis="#404040",mar=c(5,4.5,4,2),mgp=c(3.5,1,0))
bp<-barplot(count_df,width=1.2,space=rep(c(1,0.3),4),col=c("paleturquoise3", "palegreen3"),border="#404040", axisname=F, ylab="Frequency",
            legend=row.names(count_df),ylim=c(0,max(colSums(count_df))*1.2))

第3。标记栏

mtext(side=1,line=0.8,at=bp,text=colnames(count_df))
mtext(side=1,line=2,at=(bp[seq(1,8,by=2)]+bp[seq(2,8,by=2)])/2,text=colnames(t)[-1],font=2)

<强> 4。在栏内添加值

for(i in 1:ncol(count_df)){
    val_elke<-count_df[1,i]
    val_iedere<-count_df[2,i]
    text(bp[i],val_elke/2,val_elke)
    text(bp[i],val_elke+val_iedere/2,val_iedere)
}

这是我得到的(使用我的随机数据):

enter image description here

答案 2 :(得分:2)

我基本上回答了一个不同的问题。我认为这可以被视为我的堕落,但我真的不喜欢任何类型的条形图。他们似乎总是创造浪费的空间,因为现有的信息数值对于适当构造的表来说不太有用。 vcd包提供了扩展的拼接图功能,在我看来,它更准确地称为&#34;多变量条形图,这是迄今为止我见过的任何一个。它确实要求您首先构造一个列联表,xtabs函数似乎是最合适的。

install.packages)"vcd")
library(vcd)
help(package=vcd,mosaic)
col=c("paleturquoise3", "palegreen3")
vcd::mosaic(xtabs(~Variant+Region + PrecededByPrep   +  Time, data=ttt) 
           ,highlighting="Variant", highlighting_fill=col)

enter image description here

这是5路情节,这是5路情节:

png(); vcd::mosaic( xtabs(
                  ~Variant+Region + PrecededByPrep +   Person  +  Time, 
                   data=ttt) 
                ,highlighting="Variant", highlighting_fill=col); dev.off()

enter image description here