如何在R

时间:2018-03-16 12:00:34

标签: r dataframe graph histogram bar-chart

我将从Excel转换为R以获得更好的结果。 所以实际上我有一个像这样的data.frame:

A B C D E F G
0 0 0 0 0 0 0
2 0 0 0 0 0 0
2 0 0 2 0 0 1
1 0 0 2 0 1 0

所以[A:G]是可以只包含0,1或2作为数字的列的名称。 我想要做的是绘制一个直方图或其他任何东西,以便有一个条形图存在一个列,应该被划分为百分比(0,1和2之间),所有列都在同一个图形中。

enter image description here

从图像中我们还可以看到,在y轴上我更喜欢看0到100而不是行数,但从百分比的角度来看也是如此。上一张图片正是我所需要的(也可以自定义颜色等)但是有7列。

非常感谢,安德烈。

2 个答案:

答案 0 :(得分:0)

不确定这是否是最简单的方法,但我认为它可以满足您的需求。

v <- c(0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 2, 0, 1, 0)
mtx <- data.frame(matrix(v, 4, 7, byrow = T))
names(mtx) <- c('A', 'B', 'C', 'D', 'E', 'F', 'G')

barplot(as.matrix(mtx))

new.df <- data.frame()
for(i in c('A', 'B', 'C', 'D', 'E', 'F', 'G')){
       tmp.v <- mtx[,i]
       for(j in tmp.v){
              tmp.df <- data.frame(C = i,
                                Val = j)
              new.df <- rbind(new.df, tmp.df)
       }


}

new.df$Val <- as.factor(new.df$Val)

df <- new.df %>% group_by(C, Val) %>% summarize(n = n()) %>% mutate(freq = n/sum(n))

df$freq <- as.factor(df$freq)
ggplot(df, aes(C, freq, fill= Val)) + geom_bar(stat = "identity", position = "stack")

Bar Plot

答案 1 :(得分:0)

我不确定你在问什么。如果这是关于如何重现你正在展示的情节,这里是一个如何:

library(tidyverse);
mtcars %>%
    count(cyl, am) %>%
    mutate(am = factor(am, levels = c("1", "0")), cyl = as.factor(cyl)) %>%
    ggplot(aes(x = cyl, y = n, fill = am)) +
        geom_bar(stat = "identity", position = "fill") + 
        labs(y = "pct");

enter image description here

我们可以根据您提供的样本数据生成类似的图:

# Your sample data
df <- read.table(text =
    "A B C D E F G
0 0 0 0 0 0 0
2 0 0 0 0 0 0
2 0 0 2 0 0 1
1 0 0 2 0 1 0", header = T)

library(tidyverse);
df %>%
    gather(key, value, 1:7) %>%
    count(key, value) %>%
    mutate(key = as.factor(key), value = as.factor(value)) %>%
    ggplot(aes(x = key, y = n, fill = value)) +
        geom_bar(stat = "identity", position = "fill") + 
        labs(y = "pct");

enter image description here