可视化平面上所有点的单个二维图形

2024-05-31 23:59:34 发布

您现在位置:Python中文网/ 问答频道 /正文

对于参数p和Q的给定值,我有一个M vs N曲线(为了便于理解,我们把它当作一个sigmoid)。我需要可视化p和Q的一系列值的M vs N曲线(假设0到1的10个值,即p和Q的0.1,0.2,…,0.9)

我为这个问题找到的唯一解决方案是网格图(基本上是一个矩阵图)。我想知道是否有其他的方法来可视化这种4d(?)关系除了格子图。谢谢。你知道吗


Tags: 方法网格参数关系可视化矩阵解决方案曲线
1条回答
网友
1楼 · 发布于 2024-05-31 23:59:34

我不确定我是否理解你的期望,所以请告诉我这是否在正确的轨道上。下面是使用R的三个示例

第一个确实是一个绘图矩阵,其中每个面板表示不同的q值,在每个面板内,每条曲线表示不同的p值。第二种是三维绘图,它基于三个变量(第四个变量是固定的)观察曲面。第三个是一个闪亮的应用程序,它创建了与第二个示例相同的交互式绘图,但也提供了一个滑块,允许您更改p,并查看绘图的变化。不幸的是,我不知道如何在Stackoverflow中嵌入交互式绘图,所以我只提供了代码。你知道吗

我不确定是否有一个优雅的方式来同时查看所有四个变量,但也许有人会带来额外的选择。你知道吗

各种pq

library(tidyverse)
theme_set(theme_classic())

# Function to plot
my_fun = function(x, p, q) {
  1/(1 + exp(p + q*x))
}

# Parameters
params = expand.grid(p=seq(-2,2,length=6), q=seq(-1,1,length=11))

# x-values to feed to my_fun
x = seq(-10,10,0.1)

# Generate data frame for plotting
dat = map2_df(params$p, params$q, function(p, q) {
  data.frame(p=p, q=q, x, y=my_fun(x, p, q))
})

ggplot(dat, aes(x,y,colour=p, group=p)) +
  geom_line() +
  facet_grid(. ~ q, labeller=label_both) +
  labs(colour="p") +
  scale_colour_gradient(low="red", high="blue") +
  theme(legend.position="bottom")

enter image description here

一个变量固定的3D绘图

下面的代码将产生一个交互式的三维绘图,您可以缩放和旋转。我已经固定了p的值,并为xq值的网格绘制了y曲面图。你知道吗

library(rgl)

x = seq(-10,10,0.1)
q = seq(-1,1,0.01)
y = outer(x, q, function(a, b) 1/(1 + exp(1 + b*a)))

persp3d(x, q, y, col=hcl(240,80,65), specular="grey20",
        xlab = "x", ylab = "q", zlab = "y")

我不确定如何嵌入交互式绘图,但这里有一个视角的静态图像:

enter image description here

闪亮应用

下面的代码将创建与上面相同的绘图,但是添加了使用滑块改变p并查看绘图如何更改的功能。你知道吗

打开一个R脚本文件并粘贴到下面的代码中。在它自己的目录中将它保存为app.r,然后运行代码。一个rgl窗口和一个闪亮的应用程序页面都应该打开,其中包含用于控制p值的滑块。根据需要调整窗口的大小,然后移动滑块以查看函数曲面在不同值p下的变化。你知道吗

library(shiny)

# Define UI for application that draws an interactive plot
ui <- fluidPage(

   # Application title
   titlePanel("Plot the function 1/(1 + exp(p + q*x))"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
         sliderInput("p",
                     "Vary the value of p and see how the plot changes",
                     min = -2,
                     max = 2,
                     value = 1,
                     step=0.2)
      ),

      # Show a plot of the generated distribution
      mainPanel(
         plotOutput("distPlot")
      )
   )
)

# Define server logic required to draw the plot
server <- function(input, output) {

   output$distPlot <- renderPlot({

     library(rgl)

     x = seq(-10,10,0.1)
     q = seq(-1,1,0.01)
     y = outer(x, q, function(a, b) 1/(1 + exp(input$p + b*a)))

     persp3d(x, q, y, col=hcl(240,50,65), specular="grey20",
             xlab = "x", ylab = "q", zlab = "y")

   })
}

# Run the application 
shinyApp(ui = ui, server = server)

相关问题 更多 >