R中堆积条形图的条件着色
conditional coloring in stacked bar graph in R
我在 R 中有以下代码:
dat <- as.matrix(read.table(text ="2011 2012 2013 2014
A -330.2165 500.53 730.75 -130.0941
R 2036.32 1155.91 345.81 218.0350", header=TRUE))
pts <- pretty(c(min(dat),max(dat)))
barplot(dat,
ylim=c(min(pts),max(pts)),
col=c("mediumvioletred","midnightblue"),
legend.text=c("Appropriation","Receipts"),
args.legend = list(x="topleft", bty="n"))
问题是所有的拨款 (A) 值应该是 "mediumvioletred",而所有的收入值 (R) 应该是 "midnightblue"。相反,如果 A 值为负,它们也会被着色 "midnightblue"。
有谁知道如何解决这个问题?或者至少,为绘制的每个点指定一种颜色?
我发现了很多关于条形图着色的解决方案 - 但不是堆叠条形图。这个 post 最接近:Conditional Barchart coloring with a vector in R,但仍然没有解决我的问题。
虽然不完全令人满意,但您可以通过一些额外的步骤来完成此操作:
# get the size of first bar (blue) with positive second bar added on
# first plot (blue)
barplot(firstBar,
ylim=c(min(pts),max(pts)),
col="midnightblue")
# add second plot (red)
barplot(dat[1,], col="mediumvioletred", add=TRUE)
# add legend
legend(x="topright", legend=c("Receipts", "Appropriation"),
fill=c("midnightblue", "mediumvioletred"), bty="n")
第二步将第一行添加到第二行之上。
作为替代方案,您可以在具有相邻条形图而不是堆叠条形图中使用 beside=TRUE:
barplot(dat,
col=c("mediumvioletred", "midnightblue"),
legend.text=c("Appropriation","Receipts"),
args.legend = list(x="topleft", bty="n"), beside=TRUE)
我在 R 中有以下代码:
dat <- as.matrix(read.table(text ="2011 2012 2013 2014
A -330.2165 500.53 730.75 -130.0941
R 2036.32 1155.91 345.81 218.0350", header=TRUE))
pts <- pretty(c(min(dat),max(dat)))
barplot(dat,
ylim=c(min(pts),max(pts)),
col=c("mediumvioletred","midnightblue"),
legend.text=c("Appropriation","Receipts"),
args.legend = list(x="topleft", bty="n"))
问题是所有的拨款 (A) 值应该是 "mediumvioletred",而所有的收入值 (R) 应该是 "midnightblue"。相反,如果 A 值为负,它们也会被着色 "midnightblue"。
有谁知道如何解决这个问题?或者至少,为绘制的每个点指定一种颜色?
我发现了很多关于条形图着色的解决方案 - 但不是堆叠条形图。这个 post 最接近:Conditional Barchart coloring with a vector in R,但仍然没有解决我的问题。
虽然不完全令人满意,但您可以通过一些额外的步骤来完成此操作:
# get the size of first bar (blue) with positive second bar added on
# first plot (blue)
barplot(firstBar,
ylim=c(min(pts),max(pts)),
col="midnightblue")
# add second plot (red)
barplot(dat[1,], col="mediumvioletred", add=TRUE)
# add legend
legend(x="topright", legend=c("Receipts", "Appropriation"),
fill=c("midnightblue", "mediumvioletred"), bty="n")
第二步将第一行添加到第二行之上。
作为替代方案,您可以在具有相邻条形图而不是堆叠条形图中使用 beside=TRUE:
barplot(dat,
col=c("mediumvioletred", "midnightblue"),
legend.text=c("Appropriation","Receipts"),
args.legend = list(x="topleft", bty="n"), beside=TRUE)