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

改进/未来工作:
理想情况下,在我弄清楚为什么只更新最后创建的数据表之后,我想将所有这 4 个水果热图列连接到一个数据表中,该数据表也包含国家和水果信息。 换句话说,我正在生成 4 (32x3) 个表,我想生成 1 (6x32) 个表(4 个水果热图 + 国家/地区列 + 位置列)。 目前我正在做的是使用 JMP 查询生成器进行列连接。
如果您将鼠标悬停在 trans:theList 上或者如果您指定
show(trans:theList);
在您的脚本中,它将向您显示列表中的内容。您将看到 5 个条目。第一个将是
Data Table( 'the name of your initial data table");
之后的每个条目都是指向数据表过滤器的指针,依次是 Apple、Banana、Mango,最后是 Orange。
它不包含数据,只是指向它的指针。列名等是从实际的数据表中取出来的。
您需要花时间阅读 JMP 文档库中的脚本指南,该指南位于“帮助”下拉菜单下。
谢谢,修好了!
因此,当我运行热图脚本时,会收到以下消息。 当我改变
dt= trans:thelist[5]
它有效,但同样只适用于最后创建的数据表。 这个名称空间概念对我来说也是新的。 让我试着总结一下这是在做什么,你能确认我的理解是否正确吗? 因此,通过在脚本中使用命名空间,我们能够将所有数据表名称(更重要的是该数据表的列名称和值)保存到一个列表 trans 中,然后我们在热图脚本中调用它。

我的错误,改变
insert into(theList,dt);
到
insert into(trans:theList,dt);
theList 不存在......但是 trans:theList 存在
感谢您的输入!
当我运行您提供的更新后的 extract_cols 脚本时,我收到以下有关 L 值访问的错误消息...

您正在指定
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
)
);
);
);