use of de.lmu.ifi.dbs.elki.visualization.VisualizationTask in project elki by elki-project.
the class OverviewPlot method reinitialize.
/**
* Refresh the overview plot.
*/
private synchronized void reinitialize() {
if (plot == null) {
initializePlot();
} else {
final ActionEvent ev = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, OVERVIEW_REFRESHING);
for (ActionListener actionListener : actionListeners) {
actionListener.actionPerformed(ev);
}
}
// Detach existing elements:
for (Pair<Element, Visualization> pair : vistoelem.values()) {
SVGUtil.removeFromParent(pair.first);
}
plotmap = arrangeVisualizations(ratio, 1.0);
recalcViewbox();
final int thumbsize = (int) Math.max(screenwidth / plotmap.getWidth(), screenheight / plotmap.getHeight());
// TODO: cancel pending thumbnail requests!
// Replace the layer map
LayerMap oldlayers = vistoelem;
vistoelem = new LayerMap();
// Redo main layers
SVGUtil.removeFromParent(plotlayer);
SVGUtil.removeFromParent(hoverlayer);
plotlayer = plot.svgElement(SVGConstants.SVG_G_TAG);
hoverlayer = plot.svgElement(SVGConstants.SVG_G_TAG);
hoverlayer.setAttribute(SVGPlot.NO_EXPORT_ATTRIBUTE, SVGPlot.NO_EXPORT_ATTRIBUTE);
// Redo the layout
for (Entry<PlotItem, double[]> e : plotmap.entrySet()) {
final double basex = e.getValue()[0];
final double basey = e.getValue()[1];
for (Iterator<PlotItem> iter = e.getKey().itemIterator(); iter.hasNext(); ) {
PlotItem it = iter.next();
boolean hasDetails = false;
// Container element for main plot item
Element g = plot.svgElement(SVGConstants.SVG_G_TAG);
SVGUtil.setAtt(g, SVGConstants.SVG_TRANSFORM_ATTRIBUTE, "translate(" + (basex + it.x) + " " + (basey + it.y) + ")");
plotlayer.appendChild(g);
vistoelem.put(it, null, g, null);
// Add the actual tasks:
for (VisualizationTask task : it.tasks) {
if (!visibleInOverview(task)) {
continue;
}
hasDetails |= !task.has(RenderFlag.NO_DETAIL);
Pair<Element, Visualization> pair = oldlayers.remove(it, task);
if (pair == null) {
pair = new Pair<>(plot.svgElement(SVGConstants.SVG_G_TAG), null);
}
if (pair.second == null) {
pair.second = embedOrThumbnail(thumbsize, it, task, pair.first);
}
g.appendChild(pair.first);
vistoelem.put(it, task, pair);
}
// When needed, add a hover effect
if (hasDetails && !single) {
Element hover = plot.svgRect(basex + it.x, basey + it.y, it.w, it.h);
SVGUtil.addCSSClass(hover, selcss.getName());
// link hoverer.
EventTarget targ = (EventTarget) hover;
targ.addEventListener(SVGConstants.SVG_MOUSEOVER_EVENT_TYPE, hoverer, false);
targ.addEventListener(SVGConstants.SVG_MOUSEOUT_EVENT_TYPE, hoverer, false);
targ.addEventListener(SVGConstants.SVG_CLICK_EVENT_TYPE, hoverer, false);
targ.addEventListener(SVGConstants.SVG_CLICK_EVENT_TYPE, new SelectPlotEvent(it), false);
hoverlayer.appendChild(hover);
}
}
}
for (Pair<Element, Visualization> pair : oldlayers.values()) {
if (pair.second != null) {
pair.second.destroy();
}
}
plot.getRoot().appendChild(plotlayer);
plot.getRoot().appendChild(hoverlayer);
plot.updateStyleElement();
// Notify listeners.
final ActionEvent ev = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, OVERVIEW_REFRESHED);
for (ActionListener actionListener : actionListeners) {
actionListener.actionPerformed(ev);
}
}
use of de.lmu.ifi.dbs.elki.visualization.VisualizationTask in project elki by elki-project.
the class HistogramProjector method arrange.
@Override
public Collection<PlotItem> arrange(VisualizerContext context) {
List<PlotItem> layout = new ArrayList<>(1 + dmax);
List<VisualizationTask> tasks = context.getVisTasks(this);
if (!tasks.isEmpty()) {
final double xoff = (dmax > 1) ? .1 : 0.;
final double hheight = .5;
final double lheight = .1;
PlotItem master = new PlotItem(dmax + xoff, hheight + lheight, null);
ScalesResult scales = ScalesResult.getScalesResult(rel);
for (int d1 = 0; d1 < dmax; d1++) {
Projection1D proj = new Simple1D(this, scales.getScales(), d1);
final PlotItem it = new PlotItem(d1 + xoff, lheight, 1., hheight, proj);
it.tasks = tasks;
master.subitems.add(it);
}
layout.add(master);
// Add labels
for (int d1 = 0; d1 < dmax; d1++) {
PlotItem it = new PlotItem(d1 + xoff, 0, 1., lheight, null);
LabelVisualization lbl = new LabelVisualization(RelationUtil.getColumnLabel(rel, d1));
it.tasks.add(//
new VisualizationTask(lbl, "", null, null).requestSize(1, lheight).with(RenderFlag.NO_DETAIL));
master.subitems.add(it);
}
}
return layout;
}
use of de.lmu.ifi.dbs.elki.visualization.VisualizationTask in project elki by elki-project.
the class ParallelPlotProjector method arrange.
@Override
public Collection<PlotItem> arrange(VisualizerContext context) {
List<PlotItem> col = new ArrayList<>(1);
List<VisualizationTask> tasks = context.getVisTasks(this);
if (!tasks.isEmpty()) {
ScalesResult scales = ScalesResult.getScalesResult(rel);
ProjectionParallel proj = new SimpleParallel(this, scales.getScales());
final double width = Math.max(.5, Math.ceil(MathUtil.log2(scales.getScales().length - 1)));
final PlotItem it = new PlotItem(width, 1., proj);
it.tasks = tasks;
col.add(it);
}
return col;
}
use of de.lmu.ifi.dbs.elki.visualization.VisualizationTask in project elki by elki-project.
the class ScatterPlotProjector method arrange.
@Override
public Collection<PlotItem> arrange(VisualizerContext context) {
List<PlotItem> layout = new ArrayList<>(1);
List<VisualizationTask> tasks = context.getVisTasks(this);
if (!tasks.isEmpty()) {
ScalesResult scales = ScalesResult.getScalesResult(rel);
final PlotItem master;
if (dmax == 2) {
// In 2d, make the plot twice as big.
master = new PlotItem(2 + .1, 2 + .1, null);
{
Projection2D proj = new Simple2D(this, scales.getScales(), 0, 1);
PlotItem it = new PlotItem(.1, 0, 2., 2., proj);
it.tasks = tasks;
master.subitems.add(it);
}
// Label at bottom
{
PlotItem it = new PlotItem(.1, 2., 2., .1, null);
it.tasks.add(//
new VisualizationTask(new LabelVisualization(RelationUtil.getColumnLabel(rel, 0)), "", null, null).requestSize(2., .1).with(RenderFlag.NO_DETAIL));
master.subitems.add(it);
}
// Label on left
{
PlotItem it = new PlotItem(0, 0, .1, 2, null);
it.tasks.add(//
new VisualizationTask(new LabelVisualization(RelationUtil.getColumnLabel(rel, 1), true), "", null, null).requestSize(.1, 2.).with(RenderFlag.NO_DETAIL));
master.subitems.add(it);
}
} else {
final double sizeh = Math.ceil((dmax - 1) / 2.0);
master = new PlotItem(sizeh * 2. + .1, dmax - 1 + .1, null);
for (int d1 = 0; d1 < dmax - 1; d1++) {
for (int d2 = d1 + 1; d2 < dmax; d2++) {
Projection2D proj = new Simple2D(this, scales.getScales(), d1, d2);
PlotItem it = new PlotItem(d1 + .1, d2 - 1, 1., 1., proj);
it.tasks = tasks;
master.subitems.add(it);
}
}
if (dmax >= 3) {
AffineTransformation p = AffineProjection.axisProjection(RelationUtil.dimensionality(rel), 1, 2);
p.addRotation(0, 2, MathUtil.deg2rad(-10.));
p.addRotation(1, 2, MathUtil.deg2rad(15.));
// Wanna try 4d? go ahead:
// p.addRotation(0, 3, Math.PI / 180 * -20.);
// p.addRotation(1, 3, Math.PI / 180 * 30.);
Projection2D proj = new AffineProjection(this, scales.getScales(), p);
PlotItem it = new PlotItem(sizeh + .1, 0, sizeh, sizeh, proj);
it.tasks = tasks;
master.subitems.add(it);
}
// Labels at bottom
for (int d1 = 0; d1 < dmax - 1; d1++) {
PlotItem it = new PlotItem(d1 + .1, dmax - 1, 1., .1, null);
it.tasks.add(//
new VisualizationTask(new LabelVisualization(RelationUtil.getColumnLabel(rel, d1)), "", null, null).requestSize(1, .1).with(RenderFlag.NO_DETAIL));
master.subitems.add(it);
}
// Labels on left
for (int d2 = 1; d2 < dmax; d2++) {
PlotItem it = new PlotItem(0, d2 - 1, .1, 1, null);
it.tasks.add(//
new VisualizationTask(new LabelVisualization(RelationUtil.getColumnLabel(rel, d2), true), "", null, null).requestSize(.1, 1.).with(RenderFlag.NO_DETAIL));
master.subitems.add(it);
}
}
layout.add(master);
}
return layout;
}
use of de.lmu.ifi.dbs.elki.visualization.VisualizationTask in project elki by elki-project.
the class UncertainInstancesVisualization method processNewResult.
@Override
public void processNewResult(VisualizerContext context, Object start) {
VisualizationTree.findVis(context, start).filter(ScatterPlotProjector.class).forEach(p -> {
// Find a scatter plot visualizing uncertain objects:
Relation<?> r = p.getRelation();
if (!UncertainObject.UNCERTAIN_OBJECT_FIELD.isAssignableFromType(r.getDataTypeInformation())) {
return;
}
context.addVis(p, //
new VisualizationTask(this, NAME, p, r).level(//
VisualizationTask.LEVEL_DATA).with(UpdateFlag.ON_DATA).with(UpdateFlag.ON_SAMPLE).with(UpdateFlag.ON_STYLEPOLICY));
});
}
Aggregations