就像在这里找到的图中一样,我想在同一个条形图中显示多个数据集。
我的数据基本上是各个国家的“男性/女性”身高。我想要沿 x 轴的国家和每个国家/地区的男性和女性身高的两个条形图(一个蓝色和一个红色)。
我已经为此苦苦挣扎了几天,但仍然没有弄清楚。
每个数据集当前都存储在自己的数据框中,第一列是“国家”,第二列是“高度”。所以我有一个male_heights 和female_heights 数据框。
谢谢!
这是一个带有一些虚拟数据的示例:
# create some dummy data of two data.frames for male and female
set.seed(45)
dd.m <- data.frame(country = sample(letters[1:8]), height=sample(150:200, 8))
dd.f <- data.frame(country = sample(letters[1:8]), height=sample(130:180, 8))
# create an grp column for each of the above data.frames (M, F -> male, female)
dd.m$grp <- "M"
dd.f$grp <- "F"
# merge data together
dd <- rbind(dd.m, dd.f)
# set levels for grp column - which one should be displayed first within the group
# here, female followed by male
dd$grp <- factor(dd$grp, levels=c("F", "M"), ordered=TRUE)
# make sure country is a factor (reorder levels if you have to)
dd$country <- factor(dd$country)
# plot using ggplot
require(ggplot2)
ggplot(data = dd, aes(x=country)) +
geom_bar(aes(weights=height, fill=grp), position="dodge") +
scale_fill_brewer(palette = "Set1")
这给出了:
首先,您应该根据国家/地区合并两个 data.frame。您可以使用例如 ggplot2 进行绘图。
这是使用 ggplot2 的示例:
# some data
male_heights <- data.frame(country = LETTERS[1:20],
heights = runif(20, 10,20))
female_heights <- data.frame(country = LETTERS[1:20],
heights = runif(20, 10,20))
# merge both data.frame
df_m <- merge(male_heights, female_heights, by = 'country', suffixes=c('_males', '_females'))
# bring data to long format
require(reshape2)
dfm <- melt(df_m)
# plot
ggplot(dfm, aes(x = country, y = value, fill = variable)) +
geom_bar(stat = 'identity', position = 'dodge')
为了完整起见,这里有一些其他可用选项,一个在基本 R 中,一个带有通常与 R 一起安装的“lattice”包。使用@Arun 的示例数据,这里是每个的基本示例。(有很多方法可以自定义每个的外观。)
## Base R -- Nothing fancy.
## Requires a vector or matrix for your data
barplot(xtabs(height ~ grp + country, dd),
beside = TRUE, col = c("red", "blue"))
## lattice -- can work directly with your data.frame
## Several interesting options for groupings
library(lattice)
barchart(height ~ country, data = dd, groups = grp,
ylim = c(0, max(dd$height)+10), col = c("red", "blue"))