叠加图<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好,
我在堆叠列时遇到了问题。 我查看的数据可以进入数百列数据。 我经常将列堆叠在一起,以便可以在该列上使用分布图。 但有时我的数据表会包含数百万行数据,并且当我堆叠列时它开始崩溃。 我想知道是否有一种方法可以叠加一堆分布图来制作一个图,而不必将所有列堆叠在一起? L喜欢绘制大量列并将所有这些图表叠加到一个图表中吗?
感谢您的任何帮助!
回复:叠加图在机器的硬件限制范围内,JMP 通常擅长这种事情。 我假设(由于某种原因)不可能将数据导入到单个列中。
您可以使用下面的代码进行实验。 在我的机器上,这需要八秒钟,但其中一半以上的时间都花在构建起始表格并评估其中的公式上。 设置 nr = 1,000,0000 给出的运行时间约为一分钟。
NamesDefaultToHere(1);
// Number of columns and rows
nc = 130;
nr = 100000;
// Make a test table, dt1, to work with
dt1 = NewTable("Test", NewColumn("Column 1", Numeric, Continuous, Formula(RandomNormal())),AddRows(nr));
For(i=2, i<=nc, i++, dt1 << NewColumn("Column "||Char(i), Numeric, Continuous, Formula(RandomNormal())));
// Get the data from the table into a matrix
m = dt1 << getAsMatrix;
// Close dt1 to recover some memory
Close(dt1, NoSave);
// Reshape into a column vector
m = Shape(m, NRow(m)*NCol(m), 1);
// Make a new table
dt2 = NewTable("Test in a Single Column", NewColumn("All", Numeric, Continuous, Values(m)));
// Recover memory
m = [];
回复:叠加图感谢您的所有建议!
不幸的是,这并不是我真正想要的。 看来JMP就是做不到我想要的。 因为我不想将所有列堆叠在一起,但我想要所有数据的分布图。
DropAllOtherColumns 是一个我不知道的有用函数。 我将不得不尝试一下,看看堆叠我的列并添加该函数是否可以提高效率。
另外,Peter,我不关心查看什么值对应于分布中的哪个级别,这就是为什么我想要相当于堆栈的东西,但没有内存消耗方面。 但该分布图看起来很像我想要的,不幸的是我没有 JMP 版本 12。 我还有 130 个变量。哈哈
谢谢你!
回复:叠加图我认为这种覆盖在分发平台中是不可能的。 根据我的经验,堆叠速度相当快。 下面的示例代码在我的笔记本电脑上运行只需几秒钟。 如果将数据数量增加到 10^8,速度会变慢,但瓶颈是分发平台,而不是堆叠。
另一个注意事项;数百万数据的直方图看起来与数据的较小随机子集没有太大区别。 因此,如果性能是一个问题,您可以尝试在可视化之前缩小数据集的大小(或者您可能只是需要更多 RAM)。
dt = New Table("big");
nr = 100000;
nc = 100;
dt << add rows(nr);
For(i = 1, i <= nc, i++,
dt << New Column("col" || Char(i), set each value(Random Normal()))
);
dt_stacked = dt << Stack(
columns(dt << get column names),
Source Label Column("Label"),
Stacked Data Column("Data"),
Drop All Other Columns(1)
);
dt_stacked << Distribution(Continuous Distribution(Column(:Data), Outlier Box Plot(0)));
回复:叠加图我听说过的关于 JMP 的经验法则是可用内存是数据集大小的两倍。那么也许需要更多内存?
回复:叠加图这应该会堆叠您的数据而不会重复太多。它删除标签列,因为您不关心值来自哪个原始列。删除所有其他列可能是您正在寻找的部分。
newdt = Data Table( "Big Class" ) << Stack(
columns( :height, :weight, :age ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Drop All Other Columns( 1 ),
Output Table( "hw" )
);
newdt << deletecolumns( "label" );
newdt << Distribution( Continuous Distribution( Column( :Data ) ) );

回复:叠加图sophiaw:在 JMP 版本 12 中,您可以创建以下可视化效果(BigClass)按性别划分的身高(叠加)。

我想这就是你所追求的可视化? 但不幸的是,您必须堆叠 Overlay 变量,并且您说从数据表管理的角度来看这是有问题的。 你有多少内存? 也许添加更多内存可以帮助解决崩溃问题? 除此之外,按照您建议的尽可能多的覆盖变量级别,我只是想知道您的图表在视觉上的美观程度如何? 更不用说能够真正分辨出哪个级别是哪个级别了。 直方图叠加可视化实际上是最有效的,只需相对少量的叠加变量级别。
回复:叠加图这很有帮助,但并不完全是我想要的。 我希望它本质上看起来与分布图(您选择一列并绘制它的图表)完全相同,只是我希望能够选择多个列并创建分布。 我只想要一张图表,底部有值,y 轴上有多少数据。 现在,我必须将想要绘制图表的所有列堆叠在一起,然后绘制新列(这正是我想要的)。 唯一的问题是我想要将大约 130 列绘制在一起,而将它们堆叠起来是不合理的,特别是当我的数据表通常有数百行或数千行时,将两列堆叠在一起会重复行数;堆叠 130 会使 JMP 崩溃或花费大量时间。 图形生成器基本上什么也没告诉我,因为在这种情况下没有 x 轴,所以我不知道每个条代表多少或任何东西。
有没有一种方法可以覆盖分布图以制作所有列的一个图,而不是分离出每一列?
谢谢!
回复:叠加图看看图形生成器是否会做你想要的。选择所有列并将它们放在 Y 轴上。您会看到点云。这是使用年龄、身高、体重的大类:

然后右键->添加->直方图:

然后右键单击->点->删除,单击完成

单击标题并按删除(或添加更好的标题)

然后你可以使用红色三角形来复制脚本:
Graph Builder(
Size( 534, 418 ),
Show Control Panel( 0 ),
Variables( Y( :age ), Y( :height, Position( 1 ) ), Y( :weight, Position( 1 ) ) ),
Elements( Histogram( Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "Students" )} ),
Dispatch( {}, "X title", TextEditBox, {Set Wrap( 2 )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "" )} ),
Dispatch(
{},
"Graph Builder",
FrameBox,
{DispatchSeg(
Hist Seg( "Histogram (age)" ),
Histogram Color( -4222943 )
), DispatchSeg(
Hist Seg( "Histogram (height)" ),
Histogram Color( -13977687 )
), DispatchSeg(
Hist Seg( "Histogram (weight)" ),
Histogram Color( -3780931 )
)}
)
)
)