我正在尝试在同一图上绘制两个数据集。这些集合具有相同的x值。一组应该以y的对数刻度绘制,另一组应该以y的lin刻度绘制。对于此帖子,创建的伪数据集为
library(pracma)
x<-logseq(0.1,100,60)
y1<-logseq(50,2000,60)
y2<-linspace(0,90,60)
d<-data.frame(x,y1,y2)
我基本上是想从excel重新创建这个情节。日志空间点显示为红色,lin空间显示为蓝色。
到目前为止,我最接近R的是
scaleFactor<-max(d[,2])/max(d[,3])
Bode<-ggplot(data=d, aes(x=d[,1]))+
geom_point(aes(y=d[,2]), col="red")+
geom_point(aes(y=d[,3]*scaleFactor))+
scale_y_continuous(name="|Z|, ohm",
sec.axis=sec_axis(~./scaleFactor, name="Phase, deg."))+
scale_x_log10()+
theme_bw()+
ggtitle(plotTitle)+
labs(x="Frequency, Hz")+
theme(
plot.title = element_text(hjust = 0.5),
axis.title.y.left=element_text(color="red"),
axis.text.y.left =element_text(color="red")
)
输出以下图形,在同一图形中显示红色数据和黑色数据,但红色数据为lin标度。
已经很接近了,但是我真的需要红色数据达到对数刻度。 ggplot2上是否提供此功能?其他图形库也很有帮助。
编辑后更具再现性。
答案 0 :(得分:0)
如果base::plot
为您工作,可以使用par(new=T)
set.seed(1234)
data1 <- runif(10)
data2 <- runif(10)
par(mar=c(5.1,4.1,4.1,4.1))
plot(data1,col="red",pch=19,xlab="Index",ylab="Axis 1")
par(new=T)
plot(data2,col="blue",log="y",pch=19,axes=F,xlab="",ylab="")
axis(4)
mtext(text= "Axis 2",side = 4,line=2)
答案 1 :(得分:0)
我找到了一个可用的解决方案,方法是取其中一个数据集的对数并将其重新绘制在线性轴上。这样,ggplot喜欢的两个y轴都是线性的,但是数据显示出对数线性行为。
library(pracma)
x<-logseq(0.1,100,60)
y1<-logseq(50,2000,60)
y1<-log10(y1)
y2<-linspace(0,90,60)
d<-data.frame(x,y1,y2)
scaleFactor<-max(d[,2])/max(d[,3])
library(ggplot2)
Bode<-ggplot(data=d, aes(x=d[,1]))+
geom_point(aes(y=d[,2]), col="red")+
geom_point(aes(y=d[,3]*scaleFactor))+
scale_y_continuous(name="|Z|, ohm",
sec.axis=sec_axis(~./scaleFactor, name="Phase, deg."))+
scale_x_log10()+
theme_bw()+
labs(x="Frequency, Hz")+
theme(
plot.title = element_text(hjust = 0.5),
axis.title.y.left=element_text(color="red"),
axis.text.y.left =element_text(color="red")
)