是否有绘制连接方程式的图表的工具?
Is there a tool for drawing diagrams that connect equations?
其实我不知道怎么问这个问题。但是我有一堆方程式和常数,并且都以某种方式连接在一起。假设在 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(或其他语言)returns 你有工作流程的图表,或者类似的图表?
因为我认为任何语言都需要按顺序定义每个常数和方程,所以我只想要那个顺序
在 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)
热图
另一种可能的表示形式是热图。获取邻接矩阵,可选择删除全为零的行和列并绘图。
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)
气泡图
类似于热图,我们可以绘制气泡图:
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);
"
其实我不知道怎么问这个问题。但是我有一堆方程式和常数,并且都以某种方式连接在一起。假设在 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(或其他语言)returns 你有工作流程的图表,或者类似的图表?
因为我认为任何语言都需要按顺序定义每个常数和方程,所以我只想要那个顺序
在 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)
热图
另一种可能的表示形式是热图。获取邻接矩阵,可选择删除全为零的行和列并绘图。
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)
气泡图
类似于热图,我们可以绘制气泡图:
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);
"