![](/img/trans.png)
[英]Plot two time series with different y-axes: one as a dot plot (or a bar plot) and the other as a line
[英]How to plot bars and one line on two Y-axes in the same chart, with R-ggplot?
如何在一个折线图下方绘制分组的条形图?
该图可以将分类实验的性能(例如准确度)显示为线条(比标准线更粗)。 使用左侧的Y刻度,在0 < Accuracy < 1
之间变化,并带有以下文本:“这就是精度”。
然后,特征的数量(例如,用于文本分类)可以用条形表示。 右Y比例尺,在0 < NOoFeatures < max(featuresX)
之间变化,文本:“ No. of features”。 X比例尺,文字“每个实验使用的功能”。
实际上有四种类别的文本特征可以用堆叠(会很不错)或分组(首选)的条来表示。 如果现在所有内容都以灰度色调显示,那就太完美了;)
## Mock-up data:
performanceExps <- c(0.4, 0.5, 0.65, 0.9) # Accuracy
FeaturesExp1 <- c(featuresA=1000, featuresB=0, featuresC=0, featuresD=0) # Used features Experiment 1
FeaturesExp2 <- c(featuresA=1000, featuresB=5000, featuresC=0, featuresD=0) # Used features Experiment 2
FeaturesExp3 <- c(featuresA=1000, featuresB=5000, featuresC=10000, featuresD=0) # Used features Experiment 3
FeaturesExp4 <- c(featuresA=1000, featuresB=5000, featuresC=10000, featuresD=20000) # Used features Experiment 4
Kohske (在下面)提供了一个非常相似的示例,但是我无法使其适应我的问题(使用栏)。
library(ggplot2)
library(gtable)
library(grid)
grid.newpage()
# two plots
p1 <- ggplot(mtcars, aes(mpg, disp)) + geom_line(colour = "blue") + theme_bw()
p2 <- ggplot(mtcars, aes(mpg, drat)) + geom_line(colour = "red") + theme_bw() %+replace%
theme(panel.background = element_rect(fill = NA))
# extract gtable
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))
# overlap the panel of 2nd plot on that of 1st plot
pp <- c(subset(g1$layout, name == "panel", se = t:r))
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t,
pp$l, pp$b, pp$l)
# axis tweaks
ia <- which(g2$layout$name == "axis-l")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths)
ax$grobs <- rev(ax$grobs)
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)
grid.draw(g)
问题到此结束-这是hrbmstr的代码(谢谢!)
featPerf <- data.frame( expS=c("1", "2", "3", "4"),
Experiment1=c(1000, 0, 0, 0),
Experiment2=c(1000, 5000, 0, 0),
Experiment3=c(1000, 5000, 10000, 0),
Experiment4=c(1000, 5000, 10000,20000),
accuracy=c(0.4, 0.5, 0.65, 0.9) )
# make room for both axes ; adjust as necessary
par(mar=c(5, 12, 6, 7) + 0.4)
# plot the bars first with no annotations and specify limits for y
#barplot(as.matrix(featPerf[,2:5]), axes=FALSE, xlab="", ylab="", ylim=c(0, max(colSums(featPerf[2:5]))))
barplot(as.matrix(featPerf[,2:5]), axes=FALSE, xlab="", ylab="", beside=TRUE)
# make the bounding box (or not...it might not make sense for your plot)
#box()
# now make the left axis
axis(2, ylim=c(0, max(colSums(featPerf[2:5]))), col="black", las=1)
# start a new plot
par(new=TRUE)
# plot the line; adjust lwd as necessary
plot(x=1:4, y=featPerf[,6], xlab="Experiments", ylab="", axes=FALSE, type="l", ylim=c(0,1), lwd=5)
# annotate the second axis
axis(4, ylim=c(0,1), col="black", col.axis="black", las=1)
#axis(4, ylim=c(0,1), col="black", col.axis="black", las=1, labels="Accuracy", at = .5, side=3)
#title("An Example of Creative Axes", xlab="X values", ylab="Y=X")
mtext("Accuracy", side=4, line=3, cex.lab=1,las=2, col="black")
mtext("No. of features ", side=2, line=3, cex.lab=1,las=2, col="black")
通过调整Kohske的示例来解决。 这导致了与hrbrmstr解决方案相似的情节-完全同意重新考虑情节。
library(ggplot2)
library(gtable)
library(reshape2)
# Data
featPerf <- data.frame( exp=c("1", "2", "3", "4"),
A=c(1000, 1000, 1000, 1000),
B=c(0, 5000, 5000, 5000),
C=c(1000, 5000, 10000, 0),
D=c(1000, 5000, 10000 ,20000),
accuracy=c(0.4, 0.5, 0.65, 0.9) )
# Barplot ------------------------------------------------
# Reshape data for barplot
df.m <- melt(featPerf[-6])
# Labels for barplot
df.m$barlab <- factor(paste("Experiment", df.m$exp) )
p1 <- ggplot(df.m , aes(x=barlab, y=value, fill=variable)) +
geom_bar( stat="identity", position="dodge") +
scale_fill_grey(start =.1, end = .7 ) +
xlab("Experiments") +
ylab("Number of Labels") +
theme(legend.position="top")
g1 <- ggplotGrob(p1)
# Lineplot ------------------------------------------------
p2 <- ggplot(featPerf , aes(x=exp, y=accuracy, group=1)) + geom_line(size=2) +
scale_y_continuous(limits=c(0,1)) +
ylab("Accuracy") +
theme(panel.background = element_rect(fill = NA),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
g2 <- ggplotGrob(p2)
# Add plots together
pp <- c(subset(g1$layout, name == "panel", se = t:r))
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t,
pp$l, pp$b, pp$l)
# Add second axis for accuracy
ia <- which(g2$layout$name == "axis-l")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths)
ax$grobs <- rev(ax$grobs)
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)
# Add second y-axis title
ia <- which(g2$layout$name == "ylab")
ax <- g2$grobs[[ia]]
# str(ax) # you can change features (size, colour etc for these -
# change rotation below
ax$rot <- 270
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)
grid.draw(g)
Thx用于发布数据样本! 我想这就是你想要的。 警告 :我鼓励你做并排侧VS覆盖的地块,因为我牢牢地掌握在少数 [PDF]营,当涉及到双重轴地块。 ggplot2
很难做到是有原因的 。 为此,如果您愿意诉诸于基本图形,则非常简单。
# make a data frame for convenience
featPerf <- data.frame( exp=c("1", "2", "3", "4"),
A=c(1000, 1000, 1000, 1000),
B=c(0, 5000, 5000, 5000),
C=c(1000, 5000, 10000, 0),
D=c(1000, 5000, 10000 ,20000),
accuracy=c(0.4, 0.5, 0.65, 0.9) )
# make room for both axes ; adjust as necessary
par(mar=c(5, 5, 5, 7) + 0.2)
# plot the bars first with no annotations and specify limits for y
barplot(as.matrix(featPerf[,2:5]), axes=FALSE, xlab="", ylab="", ylim=c(0, max(colSums(featPerf[2:5]))))
# make the bounding box (or not...it might not make sense for your plot)
box()
# now make the left axis
axis(2, ylim=c(0, max(colSums(featPerf[2:5]))), col="black", las=1)
# start a new plot
par(new=TRUE)
# plot the line; adjust lwd as necessary
plot(x=1:4, y=featPerf[,6], xlab="", ylab="", axes=FALSE, type="l", ylim=c(0,1), lwd=5)
# annotate the second axis
axis(4, ylim=c(0,1), col="black", col.axis="black", las=1)
您可以根据需要调整或添加注释/边距/颜色。 我已经对它造成了足够的破坏:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.