R-图形交叉线

时间:2019-06-26 19:45:18

标签: r

我对此表示怀疑,但是老实说,我不知道该解决方案是否真的存在于R中。

我有一个x / y图,我想画两条直线,(1)从x轴到数据,另一条(2)从y轴到数据。第1行具有我的价值,这将是我的数据的三分位数。问题是,如何通过跟随y轴找到直线与给定线和绘图线相交的确切点?

我已经尝试过通过x轴的位置对y使用相同的位置。这甚至适用于一些数据,但不是全部(因为值并不总是匹配)。

这是我的例子

import wx

class TabPanel(wx.Panel):
    def __init__(self, parent, pageNum):
        self.parent = parent
        self.pageNum = pageNum
        wx.Panel.__init__(self, parent=parent)

        btn = wx.Button(self, label="Close Page " + str(pageNum))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(btn, 0, wx.ALL, 10)
        self.SetSizer(sizer)

        btn.Bind(wx.EVT_BUTTON, self.closeTab)

    def closeTab(self,event):
        #### Just one line and no extra variable to remove the selected page
        self.parent.RemovePage(self.parent.GetSelection())

class DemoFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Notebook", size=(600,400))
        panel = wx.Panel(self)
        self.tab_num = 2

        self.notebook = wx.Notebook(panel)
        tabOne = TabPanel(self.notebook, 1)
        self.notebook.AddPage(tabOne, "Page 1")

        tabTwo = TabPanel(self.notebook, 2)
        self.notebook.AddPage(tabTwo, "Page 2")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5)

        btn = wx.Button(panel, label="Add Page")
        btn.Bind(wx.EVT_BUTTON, self.addPage)
        sizer.Add(btn)

        panel.SetSizer(sizer)
        self.Layout()
        self.Show()

    def addPage(self, event):
        self.tab_num += 1
        new_tab = TabPanel(self.notebook, self.tab_num)
        self.notebook.AddPage(new_tab, "Page %s" % self.tab_num)

if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame()
    app.MainLoop()

就是这样,有时值不对应且找不到,导致直线不交叉数据值。是的,我需要尽可能自动化的东西,因为我必须将这些值保存在表上,并且不能一一尝试/一遍又一遍地出错。

谢谢!

1 个答案:

答案 0 :(得分:0)

您只需创建一个函数即可找到数据中最接近的点,并从该点进行插值。

MakeLineCoords <- function(Xvals,Yvals,targetPoint) {
  x <- vector(mode="numeric", length=length(Yvals))
  for(k in 1:length(Xvals)){
    x[k]<-(Yvals[k]-targetPoint)^2
   }
  mL=which.min(x)
  xVal=Xvals[mL]+(targetPoint-Yvals[mL])*((Xvals[mL+1]-Xvals[mL])/(Yvals[mL+1]-Yvals[mL]))
  return(xVal)
  }

然后,您可以定义要找到的目标值,并为绘图中的线创建坐标。

yTarget<-0.25
xTarget<-MakeLineCoords(tm,bs,yTarget)

plot(tm,bs,type="l",col="red")
segments(xTarget,0.0,xTarget,yTarget,col='black',lty=3,lwd=1)
segments(min(tm),yTarget,xTarget,yTarget,col='black',lty=3,lwd=1)

通过使用示例数据,我得到以下信息。希望对您有帮助

enter image description here

tinf<-quantile(ob,prob=1/3)
yTarget<-tinf
xTarget<-MakeLineCoords(bs,tm,yTarget)
plot(tm,bs,type="l",col="red")
segments(yTarget,0.0,yTarget,xTarget,col='black',lty=3,lwd=1)
segments(min(tm),xTarget,yTarget,xTarget,col='black',lty=3,lwd=1)

enter image description here