Наложение участков с осями бревна и линии в R - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь отобразить два набора данных на одном графике. Наборы имеют одинаковые значения х. Один набор должен быть нанесен на логарифмическую шкалу по оси y, другой - по линейной шкале по оси y. Для этого поста создается поддельный набор данных как

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. Точки пространства журнала отображаются красным цветом, а строки - синим.

Самое близкое, что мне удалось получить в 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")
  )

Выводит приведенный ниже график, показывающий красные данные и черные данные на том же графике, но красные данные в линейной шкале.

Это близко, но мне действительно нужно, чтобы красные данные были в масштабе журнала. Эта функция доступна даже на ggplot2? Другие графические библиотеки также будут полезны.

Отредактировано, чтобы быть более воспроизводимым.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Я нашел подходящее решение, взяв журнал одного из наборов данных и разместив его на линейной оси. Таким образом, обе оси Y линейны, что нравится ggplot, но данные показывают логарифмическое поведение.

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")
  )
0 голосов
/ 18 апреля 2019

Если 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)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...