如何在R中制作双y轴图表显示不同的比例

时间:2014-01-11 22:04:11

标签: r

我试图解决R中的一个小问题,试图在图中绘制3个不同的变量。我的数据框为Data,它有4个名为MonthMonto Otorgado acumulado% Vencida% Castigos的变量。 Data有下一个表单(我在最后一部分添加了dput() Data版本):

   Month  Monto Otorgado acumulado % Vencida  % Castigos
1 abr 13                 560492.3 0.000000000 0.01427317
2 may 13                1433973.4 0.007937344 0.01046045
3 jun 13                3016748.7 0.012917208 0.09281516
4 jul 13                4241217.7 0.032433503 0.07073440
5 ago 13                6251742.3 0.039709465 0.03039153
6 sep 13                6757161.2 0.055510741 0.05179690
7 oct 13                7408081.0 0.052154108 0.02024816
8 nov 13                7899980.3 0.051551260 0.02531652

Month显示特定的一年中的某个月,Monto Otorgado acumulado的值为700万,% Vencida% Castigos为百分比。我试图在R中制作一个显示两个y轴的图形。考虑Monto Otorgado acumulado的值,第一个y轴将显示比例,第二个y轴将显示考虑% Vencida% Castigos的百分比值的比例。在x轴中使用变量Month来显示变量Monto Otorgado acumulado% Vencida% Castigos会发生什么。关于在ggplot中只绘制一个变量我有点想法,但在这种情况下对我来说是如此复杂。我希望得到一个这样的图形:

enter image description here

dput()的{​​{1}}版本是下一个:

Data

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

你可以在base中执行此操作,但这有点烦人。您必须计算左轴和右轴之间的比率(在您的情况下,您希望左侧的9000000在右侧为14%)。您可以使用pointslines在同一设备上获取barplotplot

par(mar=c(5,5,2,3)+0.1)
ratio<-9e6/0.14
bar.col<-'#558ED5'
vencido.col<-'#77933C'
castigos.col<-'#FE0F0F'
b<-barplot(Data$'Monto Otorgado acumulado',names.arg=Data$Month,col=bar.col,border=FALSE,main='My Plot',ylim=c(0,9e6),axes=FALSE)
lines(b,Data$'% Vencida' * ratio, col=vencido.col,lwd=2) 
points(b,Data$'% Vencida' * ratio, col=vencido.col,bg='white',pch=21) 
lines(b,Data$'% Castigos' * ratio, col=castigos.col,lwd=2)
points(b,Data$'% Castigos' * ratio, col=castigos.col,bg='white',pch=21)
left.axis.pos<-seq(0,9e6,by=1e6)
axis(2,at=left.axis.pos,labels=formatC(left.axis.pos, big.mark = ",", format = "d"),las=2)
right.axis.ticks<-0:14
axis(4,at=(right.axis.ticks/100)*ratio,labels=paste0(right.axis.ticks,'%'),las=2)
legend('topleft',legend=c('Monto Otorgado acumulado','% Vencido','% Castigos'),col=c(bar.col,vencido.col,castigos.col),lty=1,lwd=c(4,2,2),bty='n')
par(mar=c(5,4,2,2)+0.1)

enter image description here