Есть ли инструмент для рисования диаграмм, соединяющих уравнения? - PullRequest
1 голос
/ 01 августа 2020

Я вообще-то не знаю, как задать этот вопрос. Но у меня есть куча уравнений и констант, и все они как-то связаны. Скажем, следующий код в Matlab, например:

R=8.314;
n=0.412;
a=4;
m=2;
S=10;
rho=1;
F=m*a;
P=F/S;
V=m/rho;
T=(P*V)/(n*R);

Есть ли способ, которым Matlab (или другой язык) возвращает вам диаграмму с рабочим процессом или что-то в этом роде?

введите описание изображения здесь

Потому что я думаю, что любой язык должен определять каждую константу и уравнение по порядку, поэтому я просто хочу вернуть этот порядок

1 Ответ

4 голосов
/ 02 августа 2020

В R используйте пакет igraph, как показано. Мы предполагаем, что ввод - это символьная строка Lines, показанная в конце примечания.

Прочтите ввод, используя scan (scan также может читать из файла, но чтобы все оставалось самодостаточным, мы используйте символьную строку в качестве ввода здесь), удалите пустые компоненты и удалите пробелы.

Извлеките lhs и rhs каждой строки.

Затем для каждого элемента rhs получите переменные в он дает список L. Замените имена символьными метками в форме переменная = выражение.

Преобразовать во фрейм данных, а из него в объект igraph g и построить.

library(igraph)
set.seed(123)

V1 <- scan(text = Lines, sep = ";", what = "", quiet = TRUE)
V1 <- gsub(" ", "", V1[V1 != ""])

lhs <- sub("=.*", "", V1)
rhs <- sub(".*=", "", V1)

L <- setNames(lapply(rhs, function(x) all.vars(parse(text = x))), V1)
L <- lapply(L, function(x) ifelse(x %in% lhs, 
  paste0(x, "=", rhs[match(x, lhs)]), x))

g <- graph.data.frame(stack(L))
plot(g, vertex.color = NA, vertex.frame.color = NA)

screenshot

Heatmap

Another possible representation is as a heatmap. Get the adjacency matrix, optionally remove rows and columns which are all zero and plot.

m <- as.matrix(get.adjacency(g))
m <- m[apply(m > 0, 1, any), apply(m > 0, 2, any)] # rm 0 rows & cols
heatmap(m, Rowv = NA, Colv = NA, col = 2:3, scale = "none", 
  margins = c(7, 7), cexCol = 1, cexRow = 1)

screenshot

Bubble plot

Similar to the heat map we could draw a bubble plot:

library(ggplot2)
ggplot(stack(L), aes(ind, values)) + geom_point(cex = 10) + xlab("") + ylab("")

Скриншот

Текст

Другая возможность - просто показать зависимости с помощью текста. Вместо этого отобразите только L, если вы хотите увидеть компоненты, которые также не имеют зависимостей.

L[lengths(L) > 0]

давая:

$`F=m*a`
[1] "m=2" "a=4"

$`P=F/S`
[1] "F=m*a" "S=10" 
 
$`V=m/rho`
[1] "m=2"   "rho=1"

$`T=(P*V)/(n*R)`
[1] "P=F/S"   "V=m/rho" "n=0.412" "R=8.314"

и инвертируя список:

lapply(split(stack(L), stack(L)$values), function(x) as.character(x$ind))

подача:

$`a=4`
[1] "F=m*a"

$`F=m*a`
[1] "P=F/S"

$`m=2`
[1] "F=m*a"   "V=m/rho"

$`n=0.412`
[1] "T=(P*V)/(n*R)"

$`P=F/S`
[1] "T=(P*V)/(n*R)"

$`R=8.314`
[1] "T=(P*V)/(n*R)"

$`rho=1`
[1] "V=m/rho"

$`S=10`
[1] "P=F/S"

$`V=m/rho`
[1] "T=(P*V)/(n*R)"

Примечание

Lines <- "
  R=8.314;
  n=0.412;
  a=4;
  m=2;
  S=10;
  rho=1;
  F=m*a;
  P=F/S;
  V=m/rho;
  T=(P*V)/(n*R);
"
...