ggplot2在堆栈百分比条形图中排序数据

时间:2012-03-05 23:21:46

标签: r ggplot2

我在csv文件中有以下格式的数据

,BC1,BC10,BC11
1,2432,420,18
2,276,405,56
3,119,189,110
4,90,163,140
5,206,280,200
6,1389,1080,1075
7,3983,3258,4878
8,7123,15828,28111
9,8608,48721,52576
10,9639,44725,55951
11,8323,45695,32166
12,2496,18254,26600
13,1524,8591,18583
14,7861,1857,1680
15,10269,5165,4618
16,13560,64636,63262

我以下列方式获取数据

data <- read.csv(file="file.csv",sep=",",header=TRUE)
data <- data[,2:ncol(dat)]

然后转换它

datam <- melt(cbind(data,ind=rownames(data)),is.var = c('bind'))

然后我创建一个堆积百分比图

ggplot(datam,aes(x = variable, y = value,fill = ind)) + 
geom_bar(position = "fill") + 
scale_y_continuous(labels = percent_format())

我得到了:

enter image description here

我正在尝试命令传说中的值(1 ... 16)而不是1,10,...,16,2 ...,9。但是,图例中的颜色顺序是正确的。谢谢

1 个答案:

答案 0 :(得分:3)

这是因为ind(您的填充变量)被排序为字符串因子。

您可以将ind转换为数字,然后将其用作填充参数:

datam$ind <- as.numeric(datam$ind)
ggplot(datam, aes(x=variable, y=value, fill=factor(ind))) + ...

但是,这确实会将factor(ind)作为图例的标题。你可以这样做:

datam$ind <- factor(as.numeric(datam$ind))
ggplot(datam, aes(x=variable, y=value, fill=ind)) + ...

或者,您可以使用scale_fill_discrete('My Legend Name')并避免转换datam,例如:

ggplot(datam, aes(x=variable, y=value, fill=factor(as.numeric(ind)))) + ... +
      scale_fill_discrete('legend name')

修改

图例标签的排序由levels(datam$ind)确定:

> levels(datam$ind)
[1] "1"  "10" "11" "12" "13" "14" "15" "16" "2"  "3"  "4"  "5"  "6"  "7"  "8" 
[16] "9" 

这就是你最初获得字符串顺序的原因。 通过执行factor(as.numeric(ind))levels(datam$ind)按数字顺序重新排序。

所以要指定它们从16到1,比如说,你可以这样做:

lvls <- levels(datam$ind) # "1" "10" "11" ...
lvls <- sort(as.numeric(lvls)) # 1 2 3 4 ..
lvls <- rev(lvls)              # 16 15 14 13 ...
# re-level datam$ind according to lvls:
datam$ind <- factor(datam$ind, levels=lvls)

# now we can plot!
ggplot(datam, aes(x=variable, y=value, fill=ind)) + ...

嗯,这确实改变了颜色/堆叠顺序。我不确定如何让标签走向一个方向,但堆叠走向另一个 - ggplot总是让它们同步(即如果标签是1:16,那么堆叠顺序也是如此)。重新切换颜色,我确信有一些ggplot方法可以通过scale_colour_manual来反转颜色标度(因为这只是一个整容变化) - 我不知道如何自己这样做。