在数据表上创建热图并使用脚本更新颜色渐变你好,
我有很多数据,我喜欢将数据表中的数据绘制为热图。 我在下面附上了示例数据表图像的图像以及在数据表上创建热图的步骤。 它遵循以下步骤:
- 使用tabulate后获取数据表
- 堆叠所有列(“类型”除外)。 然后对整个数据集进行汇总,找出最小值、中位数和最大值。
- 取出步骤2中的最小值、中值和最大值,并将它们放入颜色梯度值中。
运行这些步骤后的数据表结果如下所示。 目前,我手动执行步骤 3,其中无论我在摘要后得到什么值,我都会输入颜色渐变值。 有没有办法使用脚本从摘要数据表中获取值(最小值、中值、最大值)并将其输入到颜色渐变中?
我还附上了示例数据集。


大规模定制回复:在数据表上创建热图并使用脚本更新颜色渐变感谢您的所有意见和帮助! 我不知道脚本索引它有很大帮助。 我发布了下面使用的代码作为我的最终版本
Names Default To Here( 1 );
Clear Symbols();
dt = Current Data Table();
///////////////////////////////////
// Setting Variables for script ///
rev_scale =1;
mean_median = 0; //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 );
// 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);
// 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__ ) <<
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
)
);
);
);回复:在数据表上创建热图并使用脚本更新颜色渐变Maximum、Minimum 和 Median 函数不会对列列表执行累积计算。我发现执行此操作的最简单方法是将引用的列转换为矩阵,然后计算统计数据,因为最大值、最小值和中值函数将在矩阵中工作。
这是一个执行该计算的简单脚本
Names Default To Here( 1 );
Clear Symbols();
dt = Open( "$SAMPLE_DATA/big class.jmp" );
colList = dt << get column names( continuous, string );
// Create a temporary subset to calculate the required overall statistics
dtsub = dt << subset(columns(colList), selected rows(0),invisible);
// Move the data into amatrix
allData = dtsub << get as matrix;
// Close the no longer needed temporary daa table
close(dtsub, nosave);
// Calculate the statistics across the full data matrix
myMax = Maximum(allData);
myMin = Minimum(allData);
myMid = Median(allData);
我强烈建议您花时间阅读脚本指南,它可以在
帮助=>JMP 文档库
我还建议您熟悉脚本索引,它也可以在“帮助”下拉菜单下找到。
回复:在数据表上创建热图并使用脚本更新颜色渐变谢谢,这非常接近我需要的! 唯一的问题是热图根据该列的最大值、最小值和中值给出梯度,而不是根据整个数据表。 基本上在下面的代码中,我想在进入 for 循环给单元格着色之前找到最大值、最小值和中值。 当我执行此操作时,函数 Maximum、Minimum 和 Median 无法识别传递来提取最大值的 colList。 jsl 有没有办法在运行获取列名称时根据列表查找最大值、最小值和中位数? 或者这需要进入for循环吗?
Names Default To Here( 1 );
Clear Symbols();
//dt = Open( "$SAMPLE_DATA/big class.jmp" );
dt = Current Data Table();
colList = dt << get column names( continuous, string );
myMax = Maximum(colList);
myMin = Minimum(colList);
myMid = Median(colList);
print(myMax);
print(myMin);
print(myMid);
print(colList);
For( i = 1, i <= N Items( colList ), i++,
/*
Eval(
Substitute(
Expr(
Summarize(
dt,
myMax = Max( __col__ ),
myMin = Min( __col__ ),
myMid = Mean( __col__ )
)
),
Expr( __col__ ), colList[i]
)
);
*/
Eval(
Substitute(
Expr(
Column( __col__ ) <<
set property(
"color gradient",
{"Green Yellow Red",
//Range( {__Max__, __Min__, __Mid__} ),"Reverse Scale"}
Range( {__Max__, __Min__, __Mid__} )}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);回复:在数据表上创建热图并使用脚本更新颜色渐变我的错误...... myMax 等的初始值是在我编写脚本时从之前的执行中继承的。下面是一个修复
Names Default To Here( 1 );
Clear Symbols();
dt = Open( "$SAMPLE_DATA/big class.jmp" );
colList = dt << get column names( continuous, string );
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Summarize(
dt,
myMax = Max( __col__ ),
myMin = Min( __col__ ),
myMid = Mean( __col__ )
)
),
Expr( __col__ ), 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
)
);
);回复:在数据表上创建热图并使用脚本更新颜色渐变当我按原样运行您的脚本(使用大类数据集)时,它崩溃了,我收到以下消息:
Name Unresolved: myMax in access or evaluation of 'myMax' , myMax/*###*/
at line 25 in Script 4.jsl
回复:在数据表上创建热图并使用脚本更新颜色渐变下面是一个自动对 Big Class 示例数据表的列进行着色的示例。您应该能够从此脚本分支以使其能够处理您的数据
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
colList = dt << get column names( continuous, string );
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Summarize(
dt,
myMax = Max( As Column( __col__ ) ),
myMin = Min( As Column( __col__ ) ),
myMid = Mean( As Column( __col__ ) )
);
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
)
)
);回复:在数据表上创建热图并使用脚本更新颜色渐变感谢您的投入! 我使用你的脚本作为一个很好的起点,但我希望使它更加动态。
- 因此,在脚本中,您手动将最大值、最小值和中值设置为值,有什么方法可以通过图像中步骤2中的输出汇总表来设置它们。 基本上这个最大值、最小值和中值都在 Group:0 测试的范围内:AI 希望获得整个表的最大值、最小值和中值范围。
- 我必须将 Color Cell by Value(1) 添加到我的脚本中,并且我也一直在尝试设置反向比例,并且一直收到错误消息,知道如何执行此操作吗?
- 另外,可以安全地假设要在所有列上运行颜色渐变,我需要在您发送的代码之外进行 for 循环吗? 或者还有其他方法可以做到这一点吗?
names default to here(1);
dt=current data table();
dt:"Group:0, test:A" << set property("color gradient",{"Green Yellow Red", Range(
{-142.439058836207, -42.6065023706896, -97.9221899694684}
)});
Max = -142.439058836207;
Min = -42.6065023706896;
Mid = -97.9221899694684;
Eval(
Substitute(
Expr(
dt:"Group:0, test:A"n << set property(
"color gradient",
{"Green Yellow Red", Range( {__Max__, __Min__, __Mid__} )},
)
:dt << Color Cell by Value( 1 );
),
Expr( __Max__ ), Max,
Expr( __Min__ ), Min,
Expr( __Mid__ ), Mid
)
);回复:在数据表上创建热图并使用脚本更新颜色渐变这是设置颜色渐变的 JSL
names default to here(1);
dt=current data table();
dt:"Group:0, test:A"n << set property("color gradient",{"Green Yellow Red", Range(
{-142.439058836207, -42.6065023706896, -97.9221899694684}
)});
我发现将值插入所需列表的最简单方法是使用类似于下面的代码:
Max = -142.439058836207;
Min = -42.6065023706896;
Mid = -97.9221899694684;<BR />
Eval(
Substitute(
Expr(
dt:"Group:0, test:A"n << set property(
"color gradient",
{"Green Yellow Red", Range( {__Max__, __Min__, __Mid__} )}
);
),
Expr( __Max__ ), Max,
Expr( __Min__ ), Min,
Expr( __Mid__ ), Mid
)
);