【问题标题】:R plot isoclines for a given value (z), where x*y=zR 绘制给定值 (z) 的等倾线,其中 x*y=z
【发布时间】:2022-01-18 23:42:48
【问题描述】:

我正在尝试绘制一条线,其中包含等于给定值 (z) 的 xy 的所有乘积。

现在我可以制作所有xy 配对的矩阵,然后希望在group_id 中获得足够的条目以便能够绘制线。这并不优雅,并且比我想要设置值 z 来绘制更近似。

有没有比我下面列出的更聪明的方法来做到这一点?我宁愿只提供xy 的向量,并能够在x*y = z 处绘制一条线,我提供z 的值。这更像是一个“求解器”类型的问题吗?

library(tidyverse)

# Create a data.frame with each combination of values of A and B
df <- expand.grid(A = seq(0, 1, 0.001), B = seq(0, 100, .1))

# possible products of A and B
df$AB <- with(df, A*B)

# make a for each unique AB
df$group_id <- df %>% group_indices(AB)

# how many entries in the group, need enough to plot
df1 <- df %>% 
  group_by(group_id) %>% 
  mutate(nID = n()) %>%
  ungroup()

df2 <- df1 %>% filter(AB > 0)

# an example to plot more than one line
#df3 <- df2 %>% filter(nID > 40)

# an example to plot just one line
df3 <- df2 %>% 
  filter(AB == 8.316)

# plot isocline
df3 %>% #group_by(group_id) %>% 
  ggplot(., aes(x = A, y = B, color = factor(AB))) + geom_line()

###

【问题讨论】:

  • 我不保证感兴趣的z 将使用上面或下面包含在内,在使用扩展网格时无需进行大量预检查。我希望能够选择任何z(前提是它包含在x*y的范围内
  • 可能是我,但我不明白这个......在范围内 - 如该范围内的 any 值,或仅 x*y 实际采用的那些值?您在寻找什么?
  • 让我按照我现在的理解来表述这个问题:给你一个值 z。并且您想知道新向量 x*y 的值是否包含足够的 z 以绘制一条线?您将多少分定义为“足够”的分界线? (你已经可以通过两点画一条线了)
  • 另外,x 和 y 是否总是要排序的? (例如只增加)?它们是否只有独特的价值?虽然我现在不知道如何,但这些信息可能与有效的解决方案相关。

标签: r ggplot2 solver


【解决方案1】:

根据评论,不确定您的实际问题是什么。我想你只是在寻找一个功能。您也不需要所有的分组步骤。下面只是一个建议。

library(tidyverse)
df <- expand.grid(A = seq(0, 1, 0.001), B = seq(0, 100, .1))

draw_z <- function(df, z){
df %>%
  mutate(AB = A*B) %>% 
  filter(AB > 0, AB == z) %>%
  ggplot(aes(x = A, y = B)) + 
  geom_line()
}

draw_z(df, 8.316)

reprex package (v2.0.1) 于 2021 年 12 月 15 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 2011-04-28
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多