여러 열과 행이 있는 데이터 테이블이 있습니다.
각 열을 반복하고 x축에 그래프 빌더를 추가하고 싶습니다.
이것은 내 간단한 스크립트입니다
dt = Open( filepath );
all_cols = dt << Get Column Names( "String" );
cols_to_plot={};
For Each ({col}, all_cols,
If(col == "A" || col == "B",,
Insert into (cols_to_plot, col);
)
);
graph = dt << Graph Builder();
For Each ({col},cols_to_plot,
graph << Add Variable ("X", Column(dt, col)); // Also tried graph << Add Variable (X, Column(dt, col));
);
이 스크립트는 항상 아래 오류를 발생시킵니다.
인수 값이 '변수 추가'의 액세스 또는 평가에서 유효하지 않습니다. 잘못된 인수("X"), 변수 추가("X", 열(dt, col)) /*###*/600번째 줄
아래 스크립트를 실행하면 정상적으로 작동하지만 약 1000개의 열에 대해 플롯하고 싶습니다.
graph = dt << Graph Builder(
Variables(X(cols_to_plot[1]),X(cols_to_plot[2]),X(cols_to_plot[3]));
);
여기서 내가 놓친 게 뭐죠? 도와주셔서 감사합니다.
편집(jthi): jsl 포맷 추가
어떤 유형의 플롯을 원하는지 정확히 알 수 없지만 한 가지 예는 다음과 같습니다.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
cols_to_plot = {"age", "sex"};
graph = dt << Graph Builder();
For Each ({col},cols_to_plot,
Eval(EvalExpr(
graph << Add Variable({Expr(NameExpr(AsColumn(dt, col))), Role("X")});
));
);
<< 변수 추가에 대한 스크립팅 인덱스에서 올바른 구문을 확인하고 표현식 평가를 사용하여 올바른 형식으로 열 참조를 가져옵니다.

(최종 플롯에 따라 전체 그래프 빌더 표현식을 작성하는 다른 경로를 선택할 수도 있습니다.)
이 방법을 시도해 보았고 또한 시도해 보았습니다.
For Each ({col}, cols_to_plot,
col_ref = Column(dt, col);
graph << Add variable (col_ref, Role("X"));
);
두 경우 모두 내 jsl이 중단되고 데이터 테이블에는 1000개의 열과 500개의 행만 있습니다.
이것이 효율적인 방법인가요 아니면 테이블의 모든 열을 X축에 한 번에 표시하는 더 나은 방법이 있나요? GUI에서 동일한 것을 시도하면 훨씬 더 빠릅니다.
모든 열이 X축에 직렬로 배치된 간단한 산점도를 만들려고 합니다.
아래와 같은 것

열이 너무 많으니 열을 하나씩 추가하는 대신 Graph Builder 표현식을 작성하는 것이 좋습니다. 그래프를 직접 만들고 스크립트를 복사하여 어떻게 작성되었는지 확인한 다음 JSL을 사용하여 복제합니다. 아래는 한 가지 예입니다.
JMP에서 스크립트를 생성했습니다.
Graph Builder(
Size(528, 458),
Show Control Panel(0),
Variables(
X(:"0.642539"n, Combine("Parallel Merged")),
X(:"0.645736349"n, Position(1), Combine("Parallel Merged")),
X(:"0.648933698"n, Position(1), Combine("Parallel Merged")),
X(:"0.652131047"n, Position(1), Combine("Parallel Merged")),
X(:"0.655328396"n, Position(1), Combine("Parallel Merged")),
X(:"0.658525745"n, Position(1), Combine("Parallel Merged")),
X(:"0.661723094"n, Position(1), Combine("Parallel Merged")),
X(:"0.664920443"n, Position(1), Combine("Parallel Merged")),
X(:"0.668117792"n, Position(1), Combine("Parallel Merged")),
X(:"0.671315141"n, Position(1), Combine("Parallel Merged")),
X(:"0.67451249"n, Position(1), Combine("Parallel Merged")),
X(:"0.677709839"n, Position(1), Combine("Parallel Merged")),
X(:"0.680907188"n, Position(1), Combine("Parallel Merged")),
X(:"0.684104537"n, Position(1), Combine("Parallel Merged")),
X(:"0.687301886"n, Position(1), Combine("Parallel Merged")),
X(:"0.690499235"n, Position(1), Combine("Parallel Merged"))
),
Elements(Points(X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10), X(11), X(12), X(13), X(14), X(15), X(16), Legend(4)))
);
JSL로 이것을 생성하려면 다음과 같이 할 수 있습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Functional Data/NMR DoE.jmp");
nrmcols = dt << get column group("NMR Spectra");
colnames = Transform Each({col}, nrmcols,
AsColumn(dt, col) << get name;
);
colnames = colnames[1::20];
var_expr = Expr(Variables());
points_expr = Expr(Points());
For Each({colname, idx}, colnames,
x_expr = EvalExpr(X(Expr(NameExpr(AsColumn(dt, colname))), Position(1), Combine("Parallel Merged")));
point_expr = EvalExpr(X(Expr(idx)));
Insert Into(var_expr, Name Expr(x_expr));
Insert Into(points_expr, Name Expr(point_expr));
);
gb = Eval(Substitute(
Expr(dt << Graph Builder(
Size(528, 458),
Show Control Panel(0),
_var_,
Elements(_points_)
)),
Expr(_var_), Name Expr(var_expr),
Expr(_points_), Name Expr(points_expr)
));
Write();
이것은 완벽하게 작동합니다. 도움을 주셔서 감사합니다.
안녕하세요,
내가 그린 이 그래프에 대해 후속 문제가 있습니다. .jmpreport, .jrp 등 내가 시도한 어떤 형식으로도 저장할 수 없습니다. 그래프를 정적 png, jpg 형식으로 저장하고 싶지 않고 데이터가 포함된 대화형 그래프를 저장하고 싶습니다.
nw = New Window("printing window",
gb = Eval(Substitute(
Expr(dt << Graph Builder(
Show Window(1),
Size(528, 458),
Show Control Panel(0),
_var_,
Elements(_points_)
)),
Expr(_var_), Name Expr(var_expr),
Expr(_points_), Name Expr(points_expr)
));
); <BR /><BR />reportpath = ::my_dir_path||"/metadata/"||metaTestfile;
newWindow<< Save(reportpath); Also tried
gb = Eval(Substitute(
Expr(dt << Graph Builder(
Show Window(1),
Size(528, 458),
Show Control Panel(0),
_var_,
Elements(_points_)
)),
Expr(_var_), Name Expr(var_expr),
Expr(_points_), Name Expr(points_expr)
));
gb << Show Window;
newWindow = Window (gb);
reportpath = ::my_dir_path||"/metadata/"||metaTestfile;
newWindow<< Save(reportpath );
The script doesn't throw any error in any case but also not saving the graph
스크립팅 인덱스에는 일반적으로 스크립팅에 대한 답변이 있습니다(<< 창 보고서 저장)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Functional Data/NMR DoE.jmp");
nrmcols = dt << get column group("NMR Spectra");
colnames = Transform Each({col}, nrmcols,
AsColumn(dt, col) << get name;
);
colnames = colnames[1::20];
var_expr = Expr(Variables());
points_expr = Expr(Points());
For Each({colname, idx}, colnames,
x_expr = EvalExpr(X(Expr(NameExpr(AsColumn(dt, colname))), Position(1), Combine("Parallel Merged")));
point_expr = EvalExpr(X(Expr(idx)));
Insert Into(var_expr, Name Expr(x_expr));
Insert Into(points_expr, Name Expr(point_expr));
);
gb = Eval(Substitute(
Expr(dt << Graph Builder(
Size(528, 458),
Show Control Panel(0),
_var_,
Elements(_points_)
)),
Expr(_var_), Name Expr(var_expr),
Expr(_points_), Name Expr(points_expr)
));
gb << Save Window Report("$DOWNLOADS/test.jrp", embed data(1));
// demo purposes
Close(dt, no save);
wait(1);
Open("$DOWNLOADS/test.jrp");
Write();