你好,
我正在使用以下脚本邮政尝试扩展从脚本创建的热图。 当前形式的脚本为所有列一起制作了一个热图,但我想要一个单独的热图 PER 列。 换句话说,我想找到某个列的最小值、中值和最大值,然后仅在该列上应用热图,然后对下一列执行相同的操作并继续。
附上以下内容
1. sample_base_table.jmp:这是正在从中提取的样本数据集。
2.extract_cols.jsl:这是总结要用于热图脚本的数据的脚本
3. heatmap.jsl:这个脚本为指定的列做热图
问题:
当我运行 extract_cols.jsl 时,我得到了 4 个名为“Untitled X”的新数据表。 然后,当我运行 heatmap.jsl 时,它只能为创建的最后一个 Untitled X 表创建热图。 我不明白这是为什么... 当我查看调试器代码时,它说“在‘列’的访问或评估中找不到列”。 但是,我打印了正在使用的列“Median(Values, Mango)”,它显示出来,所以我不确定发生了什么(见下面的输出图片)。

改进/未来工作:
理想情况下,在我弄清楚为什么只更新创建的最后一个数据表后,我想将所有这 4 个水果热图列连接到一个数据表中,该数据表还包含国家和水果信息。 换句话说,我正在生成 4 (32x3) 个表,我想生成 1 个 (6x32) 表(4 个水果热图 + 国家列 + 位置列)。 目前我正在做的方式是使用 JMP Query Builder 进行列连接。
您正在指定
Names Default To Here( 1 );
它为该特定脚本创建了一个单独的内存命名空间。也就是说,在您的 extract_cols 脚本中,有一个名为“fruit”的列表。如果在您的热图脚本中指定
myFruit = fruit[1];
你的热图脚本不会知道你的变量fruit。
在您的热图脚本中,您将变量“dt”设置为等于当前数据表。根据您的描述,您是在运行 extract_cols 脚本后立即运行 headmap 脚本。在 JMP 中的任何给定时间,只有 1 个数据表是当前活动数据表。因此,当您指定
dt = Current Data Table();
热图脚本获取当前活动数据表,这将是您在 extract_cols 脚本中创建的最后一个数据表
如果您需要将原始数据表引用传递给第二个脚本,可能还有其他 4 个数据表引用,这样做的一种方法是创建一个单独的命名空间并将引用放入该命名空间。这是对脚本的修改,创建命名空间并将数据表引用放入其中。
Names Default To Here( 1 );
Clear Symbols();
dt = Current Data Table();
if(isnamespace("trans")==0, trans = new namespace("trans"));
trans:theList = {};
insert into(theList,dt);
fruit = {"Apple","Banana","Mango","Orange"};
For(i = 1, i <= N Items(fruit), i++,
obj = dt << Tabulate(
Set Format( Uniform Format( 10, 0 ) ),
Add Table(
Column Table(
Statistics( Median ),
Grouping Columns( :fruits ),
Analysis Columns( :Values )
),
Row Table( Grouping Columns( :Countries, :locations ) )
),
Local Data Filter(
Add Filter(
columns( :fruits),
Where( :fruits == fruit[i] ),
Display( :fruits, N Items( 14 ) )
)
)
);
trans:theList[i+1] = obj<< make into data table;
Current Report() << Close Window
);
然后,您可以在热图脚本中引用命名空间以获取主表引用或命名空间中保存的任何数据表引用。
Names Default To Here( 1 );
Clear Symbols();
dt = trans:thelist[1];
dt << Begin Data Update;
///////////////////////////////////
// Setting Variables for script ///
//rev_scale = "Reverse Scale";
rev_scale =0;
mean_median = 1; //mean=0, median=1
print(mean_median);
///////////////////////////////////
//gets all columns that are continous and stores that in a list as strings.
colList = dt << get column names( continuous, string );
print(colList);
// Create a temporary subset where the columns are the column list, selects all rows,
// invisible makes it so you don't see the datatable on screen since it is temporary
dtsub = dt << subset(columns(colList), selected rows(0),invisible);
// Move the data into a matrix this will be used later to get min, max, median|mean
allData = dtsub << get as matrix;
// Close the no longer needed temporary data table
close(dtsub, nosave);
// Calculate the statistics across the full data matrix
myMax = Maximum(allData);
myMin = Minimum(allData);
if(mean_median == 0,
myMid = Mean(allData),
myMid = Median(allData)
);
print(myMax);
print(myMin);
print(myMid);
print(colList);
// Run for loop over data table with the min, max and median|mean calculated from above
// gradient color scheme needs to be set.
if(rev_scale == 1,
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Column( __col__ ) <<
set property(
"color gradient",
{"Green Yellow Red",
Range( {__Max__, __Min__, __Mid__} ),"Reverse Scale"}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);
,
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Column( __col__ ) <<
//Column( colList[i] ) <<
set property(
"color gradient",
{"Green Yellow Red",
Range( {__Max__, __Min__, __Mid__} )}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);
);
感谢您的输入!
当我运行您提供的更新后的 extract_cols 脚本时,我收到以下有关 L 值访问的错误消息...

我的错误,改变
insert into(theList,dt);
至
insert into(trans:theList,dt);
theList 不存在......但是 trans:theList 存在