我将从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之间),所有列都在同一个图形中。
从图像中我们还可以看到,在y轴上我更喜欢看0到100而不是行数,但从百分比的角度来看也是如此。上一张图片正是我所需要的(也可以自定义颜色等)但是有7列。
非常感谢,安德烈。
答案 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")
答案 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");
我们可以根据您提供的样本数据生成类似的图:
# 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");