我在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())
我得到了:
我正在尝试命令传说中的值(1 ... 16)而不是1,10,...,16,2 ...,9。但是,图例中的颜色顺序是正确的。谢谢
答案 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
来反转颜色标度(因为这只是一个整容变化) - 我不知道如何自己这样做。