好的,我在数据框中有数据,想要获取两个变量y1和y2,并创建一个并排的条形图比较,其中条形高度等于y1和y2中每个元素的值。然后我想用两个变量的比例叠加一条线,这些值的第二个y轴。我的具体问题是我不能适当地缩放第二个y轴(因此在我的例子中减小了比率,使其落入图形中)。
更一般地说,我对基本图形中的条形图如何工作有一个很难理解,并且觉得我必须通过它来破解我的方式 - 尽管阅读了多篇帖子,以及一些主要不是&#39的教程详细说明。我不清楚的一些事情; A.从df中的数据到适合条形图的数据的最佳方法是什么?数据必须像我一样转换成条形图矩阵,为什么? B.什么决定了条形的x轴位置(即什么是" myplot"对象以及如何确定这些值?有没有办法更优雅地设置我的点/线的x位置?我不得不使用有点丑陋的编码来强制它,因为我真的不明白它是如何工作的.C。我不确定如果我有df中的行名,如果我有任何类别(x轴)名称在我的条形图中。我不得不在我的情节参数中强制执行此操作.D。是否有关于某些地方的条形图的明确讨论会更深入地了解条形图的内部工作原理?
rm(list = ls(all = TRUE))
df <- data.frame(y1 = runif(10, min=0, max=1), y2 = runif(10, min=1, max=2))
df$ratio <- df$y2/df$y1
df
barmatrix <- t(df[,1:2])
barmatrix
par(mfrow = c(1,1))
myplot <- barplot(barmatrix, main="My Barchart", ylab = "Values", ylim = c(0,3), cex.lab = 1.5, cex.main = 1.4, beside=TRUE, names.arg=c("0","1","2","3","4","5","6","7","8","9"))
lines(x = myplot[1, ] + 0.5, y = df$ratio/3)
points(x = myplot[1, ] + 0.5, y = df$ratio/3)
axis(4, ylim = c(0, 20))
答案 0 :(得分:0)
您可以缩小10以适应绘图,然后缩放添加轴上的数字(即标签)。
par(mfrow = c(1,1))
myplot <- barplot(barmatrix, main="My Barchart", ylab = "Values", ylim = c(0,3), cex.lab = 1.5, cex.main = 1.4, beside=TRUE, names.arg=c("0","1","2","3","4","5","6","7","8","9"))
lines(x = myplot[1, ] + 0.5, y = df$ratio/10)
points(x = myplot[1, ] + 0.5, y = df$ratio/10)
axis(4, at=0:6/2,labels=0:6*5)
更新: 动态缩放
rm(list = ls(all = TRUE))
df <- data.frame(y1 = runif(10, min=0, max=1), y2 = runif(10, min=1, max=2))
df$ratio <- df$y2/df$y1
df
barmatrix <- t(df[,1:2])
barmatrix
sf <- max(pretty(df$ratio/3)) # scale factor
# divide by 3 since that is your limit on the barplot ylim
sf
par(mfrow = c(1,1))
myplot <- barplot(barmatrix, main="My Barchart", ylab = "Values", ylim = c(0,3), cex.lab = 1.5, cex.main = 1.4, beside=TRUE, names.arg=c("0","1","2","3","4","5","6","7","8","9"))
lines(x = myplot[1, ] + 0.5, y = df$ratio/sf)
points(x = myplot[1, ] + 0.5, y = df$ratio/sf)
axis(4, at=0:3,labels=0:3*sf)
更新2:回答更多问题。
矩阵myplot
的每一行都有每个系列的x位置。您可以找到每列的平均值,以便更灵活地找到多个系列的中点。
您也可以直接使用row.names
进行标记。
使用type="o"
,您可以一次性绘制线条和点数。
rm(list = ls(all = TRUE))
df <- data.frame(y1 = runif(10, min=0, max=1), y2 = runif(10, min=1, max=2))
df$ratio <- df$y2/df$y1
row.names(df) <- LETTERS[1:10]
df
barmatrix <- t(df[,1:2])
barmatrix
sf <- max(pretty(df$ratio/3)) # scale factor
# divide by 3 since that is your limit on the barplot ylim
sf
par(mfrow = c(1,1))
myplot <- barplot(barmatrix, main="My Barchart", ylab = "Values", ylim = c(0,3),
cex.lab = 1.5, cex.main = 1.4, beside=TRUE, names.arg=row.names(df))
lines(x = colSums(myplot)/nrow(myplot), y = df$ratio/sf,type="o")
axis(4, at=0:3,labels=0:3*sf)