10 #ifndef EMP_VISUALIZATION_UTILS_H 11 #define EMP_VISUALIZATION_UTILS_H 17 #include "../../config/config.h" 18 #include "../../tools/BitSet.h" 19 #include "../../tools/Random.h" 20 #include "../../tools/stats.h" 21 #include "../../tools/string_utils.h" 22 #include "../../tools/FunctionSet.h" 23 #include "../../tools/const.h" 26 #include "../Animate.h" 27 #include "../JSWrap.h" 63 virtual void GetHTML(std::stringstream & HTML)
override {
65 HTML <<
"<svg id=\"" <<
id 66 <<
"\" width=\"" << width
67 <<
"\" height=\"" << height <<
"\">";
81 virtual std::string
GetType()
override {
return "web::D3VisualizationInfo";}
106 EM_ASM({window[
"emp"][
"__default_draw_data_callback"] =
131 template <
typename T>
134 emp::JSWrap(func,
GetID()+
"draw_data_callback");
135 draw_data_callback =
GetID()+
"draw_data_callback";
143 draw_data_callback = func;
147 EM_ASM_ARGS({window[
"emp"][Pointer_stringify($0)]()}, draw_data_callback.c_str());
163 double value_growth_margin = 1.5;
164 double value_loss_margin = .8;
172 std::function<double(double, int, int)> scaled_d = [&](
double d,
int i,
int k){
176 std::function<double(double, int, int)> scaled_i = [&](
double d,
int i,
int k){
204 JSWrap(scaled_d,
GetID()+
"scaled_d");
205 JSWrap(scaled_i,
GetID()+
"scaled_i");
230 int grid_height = 10;
239 template <
typename DATA_TYPE =
int,
typename X_SCALE_TYPE = D3::LinearScale,
typename Y_SCALE_TYPE = D3::LinearScale>
248 DATA_TYPE x_min = 100;
250 DATA_TYPE y_max = 10;
256 x_ax(
"bottom", x_var),
257 y_ax(
"left",
"Frequency"){;}
261 x_ax.
GetScale().SetDomain(x_min, x_max);
264 y_ax.
GetScale().SetDomain(0, y_max);
272 double new_x_min = *std::min_element(data.
begin(), data.
end());
273 double new_x_max = *std::max_element(data.
begin(), data.
end());
274 bool rescale =
false;
276 if (new_x_min < x_min || (new_x_min - x_min) > .5*(new_x_max - new_x_min)) {
277 x_min = new_x_min - (new_x_max-new_x_min)*.05;
280 if (new_x_max > x_max || (x_max - new_x_max) > .5*(new_x_max - new_x_min)) {
281 x_max = new_x_max + (new_x_max-new_x_min)*.05;
288 x.SetDomain(x_min, x_max);
297 if (new_y_max > y_max) {
298 y_max = new_y_max * 1.2;
309 return x.ApplyScale(d.x0());
312 return y.ApplyScale(d.length());
315 return x.ApplyScale(d.x1()) - x.ApplyScale(d.x0()) - 1;
328 template <
typename DATA_TYPE = emp::array<
double, 2>,
329 typename X_SCALE_TYPE = D3::LinearScale,
330 typename Y_SCALE_TYPE = D3::LinearScale >
351 DATA_TYPE prev_data = {{-1,-1}};
356 std::function<double(DATA_TYPE)> return_x = [](DATA_TYPE d){
return d[0]; };
359 std::function<double(DATA_TYPE)> return_y = [](DATA_TYPE d){
return d[1]; };
362 std::function<double(DATA_TYPE)> y = [
this](DATA_TYPE d){
363 return y_scale->ApplyScale(this->return_y(d));
367 std::function<double(DATA_TYPE)> x = [
this](DATA_TYPE d){
368 return x_scale->ApplyScale(this->return_x(d));
394 JSWrap([
this](){exit.Remove(); this->DrawData(
true);},
GetID()+
"draw_data");
398 GetSVG()->SetupToolTip(*tip);
401 y_scale =
new Y_SCALE_TYPE();
402 x_scale =
new X_SCALE_TYPE();
418 SetXAccessor(return_x);
419 SetYAccessor(return_y);
454 template <
typename T>
456 SetTooltipFunction(T func) {
463 template <
typename T>
465 SetXAccessor(T func) {
467 JSWrap(return_x,
GetID()+
"return_x");
468 JSWrap(x,
GetID()+
"x");
481 return_x = [func](DATA_TYPE d){
483 return EM_ASM_DOUBLE({
484 var func_string = Pointer_stringify($0);
485 if (typeof window[func_string] ===
function) {
486 func_string = window[func_string];
487 }
else if (typeof window[
"emp"][func_string] ===
function) {
488 func_string = window[
"emp"][func_string];
489 }
else if (typeof window[
"d3"][func_string] ===
function) {
490 func_string = window[
"d3"][func_string];
492 return func_string(emp_i.cb_return);
496 JSWrap(return_x,
GetID()+
"return_x");
497 JSWrap(x,
GetID()+
"x");
502 template <
typename T>
504 SetYAccessor(T func) {
506 JSWrap(return_y,
GetID()+
"return_y");
507 JSWrap(y,
GetID()+
"y");
519 return_y = [func](DATA_TYPE d){
521 return EM_ASM_DOUBLE({
522 var func_string = Pointer_stringify($0);
523 if (typeof window[func_string] ===
function) {
524 func_string = window[func_string];
525 }
else if (typeof window[
"emp"][func_string] ===
function) {
526 func_string = window[
"emp"][func_string];
527 }
else if (typeof window[
"d3"][func_string] ===
function) {
528 func_string = window[
"d3"][func_string];
531 return func_string(emp_i.cb_return);
534 JSWrap(return_y,
GetID()+
"return_y");
535 JSWrap(y,
GetID()+
"y");
544 x_min = std::min(EM_ASM_DOUBLE({
545 return d3.min(js.objects[$0], window[
"emp"][Pointer_stringify($1)+
"return_x"]);
546 }, dataset->
GetID(), this->
GetID().c_str()), x_min);
548 x_max = std::max(EM_ASM_DOUBLE({
549 return d3.max(js.objects[$0], window[
"emp"][Pointer_stringify($1)+
"return_x"]);
550 }, dataset->
GetID(), this->
GetID().c_str()), x_max);
552 y_min = std::min(EM_ASM_DOUBLE({
553 return d3.min(js.objects[$0], window[
"emp"][Pointer_stringify($1)+
"return_y"]);
554 }, dataset->
GetID(), this->
GetID().c_str()), y_min);
556 y_max = std::max(EM_ASM_DOUBLE({
557 return d3.max(js.objects[$0], window[
"emp"][Pointer_stringify($1)+
"return_y"]);
558 }, dataset->
GetID(), this->
GetID().c_str()), y_max);
560 y_scale->SetDomain(y_max, y_min);
561 x_scale->SetDomain(x_min, x_max);
573 .
SetAttr(
"class",
"data-point")
574 .BindToolTipMouseover(*tip);
589 emp::JSWrap([
this](){DrawPointsFromDataset();},
"draw");
603 data.push_back(data_point);
605 if (data_point[1] > y_max || data_point[1] < y_min
606 || data_point[0] > x_max || data_point[0] < x_min) {
607 y_max = std::max(data_point[1]*1.2, y_max);
608 y_min = std::min(data_point[1]*.8, y_min);
609 x_max = std::max(data_point[0]*1.2, x_max);
610 x_min = std::min(data_point[0]*.8, x_min);
612 if (y_min == y_max) {
617 if (x_min == x_max) {
623 EM_ASM_ARGS({js.objects[$0].ease(d3.easeLinear).delay(10).duration(300);}, t.
GetID());
624 y_axis->
Rescale(y_max, y_min, t);
625 x_axis->
Rescale(x_min, x_max, t);
626 t.On(
"end",
GetID()+
"draw_data");
655 template <
typename T>
661 function pathTween(d1, precision) {
664 path1 = path0.cloneNode();
665 n0 = path0.getTotalLength();
666 n1 = (path1.setAttribute(
"d", d1), path1).getTotalLength();
671 dt = precision / Math.max(n0, n1);
672 while ((i += dt) < 1) distances.push(i);
676 var points = distances.map(
function(t) {
677 var p0 = path0.getPointAtLength(t * n0);
678 p1 = path1.getPointAtLength(t * n1);
679 return d3.interpolate([p0.x, p0.y], [p1.x, p1.y]);
683 return t < 1 ?
"M" + points.map(
function(p) {
return p(t); }).
join(
"L") : d1;
688 circle_data = js.objects[$0].selectAll(
".data-point").data();
689 ls = js.objects[$2].selectAll(
".line-seg");
690 var s = js.objects[$0].selectAll(
".line-seg").data([circle_data]);
691 js.objects[$3] = s.exit();
692 js.objects[$2].ease(d3.easeLinear).duration(300).selectAll(
".data-point")
693 .attr(
"cy",
emp[Pointer_stringify($4)+
"y"])
694 .attr(
"cx",
emp[Pointer_stringify($4)+
"x"]);
695 t = s.transition(js.objects[$2]).duration(300).attrTween(
"d", pathTween).ease(d3.easeLinear);
696 t.attr(
"d", js.objects[$1]);
698 .transition(js.objects[$2])
700 .attrTween(
"d", pathTween)
702 .attr(
"d",js.objects[$1](circle_data.slice(circle_data.length-2, circle_data.length-1)));
711 if ((!backlog && data.size() > 1) || data.size() == 0){
716 if (prev_data[0] >= 0 ){
718 line_data[0] = prev_data;
719 line_data[1] = data[0];
737 .
SetAttr(
"class",
"data-point")
738 .BindToolTipMouseover(*tip);
742 if (data.size() > 0) {
744 }
else if (data.size() == 0) {
760 prev_data = {{-1,-1}};
765 EMP_BUILD_INTROSPECTIVE_TUPLE(
int, name)
769 EMP_BUILD_INTROSPECTIVE_TUPLE(
double, x,
777 template <
typename NODE = TreeNode>
791 JSWrap(color_fun_node,
GetID()+
"color_fun_node");
792 JSWrap(color_fun_link,
GetID()+
"color_fun_link");
796 data->
Append(std::string(
"{\"name\": 0, \"parent\": \"null\", \"children\" : []}"));
797 tree.SetDataset(
data);
801 std::function<std::string(NODE, int)> color_fun_node = [](NODE d,
int i){
805 std::function<std::string(NODE, int)> color_fun_link = [
this](NODE d,
int i){
816 InitializeVariables();
826 template <
typename T>
828 SetTooltipFunction(T func) {
852 std::string child_json = std::string(
"{\"name\":" +
to_string(child) +
", \"parent\":" +
to_string(parent) +
", \"children\":[]}");
861 nodes_links[0].Append(
"circle").SetAttr(
"r", 2).AddToolTip(*tip);
862 nodes_links[1].Remove();
863 nodes_links[3].Remove();
879 template <
typename NODE = TreeNode>
900 InitializeVariables();
903 js.objects[$0] = [js.objects[$1][0]];
904 }, possible_parents.
GetID(),
data->GetID());
911 std::string child_json = std::string(
"{\"name\":" +
to_string(child) +
", \"parent\":" +
to_string(parent) +
", \"children\":[]}");
912 int pos =
data->AppendNestedFromList(child_json, possible_parents);
916 while (js.objects[$0].length < $1 + 1) {
917 js.objects[$0].push(-1);
919 js.objects[$0][$1] = js.objects[$0][$2].children[js.objects[$0][$2].children.length-1];
920 }, possible_parents.
GetID(), next_pos, pos);
926 AddDataPoint(next_parent, next_child);
936 EMP_BUILD_INTROSPECTIVE_TUPLE(
double, x,
945 template <
typename NODE = SpatialGr
idTreeNode,
template <
typename>
class TREE_TYPE =
TreeVisualization>
948 using TREE_TYPE<NODE>::GetID;
949 using TREE_TYPE<NODE>::GetSVG;
950 using TREE_TYPE<NODE>::InitializeVariables;
951 using TREE_TYPE<NODE>::DrawTree;
952 using TREE_TYPE<NODE>::tip;
958 int grid_height = 10;
959 int legend_cell_size = 15;
964 EMP_BUILD_INTROSPECTIVE_TUPLE( NODE, source,
969 EMP_BUILD_INTROSPECTIVE_TUPLE(
int, loc)
972 std::function<void(NODE, int)> node_mouseover = [
this](NODE d,
int i){
975 var trace_lineage =
function(root,
id) {
976 if (root.name ==
id){
980 for (var k in root.children) {
981 if (root.children[k].name ==
id) {
982 return [root.children[k].loc];
984 else if (root.children[k].children) {
985 result = trace_lineage(root.children[k],
id);
987 result.push(root.children[k].loc);
995 var result = trace_lineage(js.objects[$0][0], $1);
996 var paths = ([[result[0]%$2, Math.floor(result[0]/$2)]]);
997 for (i=1; i <result.length; i++) {
998 var old_point = paths[paths.length-1];
999 var new_point = ([result[i]%$2, Math.floor(result[i]/$2)]);
1000 paths.push(new_point);
1002 var scale = d3.scale.linear().domain([0,$2]).range([0,500]);
1003 var l = d3.svg.line().x(
function(d){
return scale(d[0]);}).y(
function(d){
return scale(d[1]);});
1004 var
svg = d3.select(
"body").append(
"svg");
1005 svg.attr(
"width", 500).attr(
"height",500);
1007 svg.selectAll(
"path").data([paths]).enter().append(
"path").attr(
"d",
function(d){console.log(d, l(d));
return l(d);}).attr(
"stroke",
"white").attr(
"stroke-width", 1).attr(
"fill",
"none");
1012 },
data->
GetID(), d.name(), grid_width);
1015 std::function<std::string(NODE, int)> color_fun_node = [
this](NODE d,
int i){
1017 return std::string(
"black");
1020 double x = (d.loc() % grid_width) - grid_width/2;
1021 double y = (d.loc() / grid_width) - grid_height/2;
1027 double theta = atan2(y, x)*(180/
emp::PI);
1030 char * color = (
char *) EM_ASM_INT({
1031 var text = d3.hcl($1, 150, $0*175).toString();
1032 var buffer = Module._malloc(text.length+1);
1033 Module.writeStringToMemory(text, buffer);
1037 std::string result = std::string(color);
1042 std::function<std::string(NODE, int)> dark_color_fun = [
this](NODE d,
int i){
1044 return std::string(
"black");
1047 double x = (d.loc() % grid_width) - grid_width/2;
1048 double y = (d.loc() / grid_width) - grid_height/2;
1054 double theta = atan2(y, x)*(180/
emp::PI);
1057 char * color = (
char *) EM_ASM_INT({
1058 var text = d3.hcl($1, 150, $0*175).darker().toString();
1059 var buffer = Module._malloc(text.length+1);
1060 Module.writeStringToMemory(text, buffer);
1064 std::string result = std::string(color);
1069 std::function<std::string(TreeEdge, int)> color_fun_link = [
this](
TreeEdge d,
int i){
1070 return this->color_fun_node(d.source(), i);
1074 std::function<void(LegendNode, int)> legend_mouseover = [
this](
LegendNode d,
int il) {
1077 EM_ASM_ARGS({
emp.filter_fun =
function(d){
return d.source.loc != $0;}}, d.loc());
1081 std::function<void(LegendNode, int)> legend_mouseout = [
this](
LegendNode d,
int i) {
1084 .SetClassed(
"faded",
false);
1087 .SetClassed(
"faded",
false);
1089 EM_ASM_ARGS({
emp.filter_fun =
function(d){
return d.source.loc != $0;}}, d.loc());
1095 var org = js.objects[$1](js.objects[$0][0], $2);
1096 var loc_history = [];
1097 loc_history.push(org.loc);
1099 while (+org.name > 0) {
1100 org = js.objects[$1](js.objects[$0][0], org.parent);
1101 loc_history.push(org.loc);
1103 emp_i.__outgoing_array = loc_history;
1105 },
data->GetID(),
data->FindInHierarchy.GetID(),
id);
1115 TREE_TYPE<NODE>::Setup();
1116 JSWrap(color_fun_node,
GetID()+
"color_fun_node");
1117 JSWrap(dark_color_fun,
GetID()+
"dark_color_fun");
1118 JSWrap(color_fun_link,
GetID()+
"color_fun_link");
1119 JSWrap(legend_mouseover,
GetID()+
"legend_mouseover");
1120 JSWrap(legend_mouseout,
GetID()+
"legend_mouseout");
1121 JSWrap(node_mouseover,
GetID()+
"node_mouseover");
1123 tip->SetHtml([
this](NODE d){
1124 return "ID: " +
to_string(d.name()) +
", Pos: (" 1138 .
On(
"mouseover",
GetID()+
"legend_mouseover")
1139 .
On(
"mouseout",
GetID()+
"legend_mouseout");
DERIVED Merge(DERIVED &other)
Definition: selection.h:171
void Setup()
Definition: visualizations.h:182
FunctionSet< void()> pending_funcs
Definition: visualizations.h:122
double x_margin
Definition: visualizations.h:93
virtual void Setup()
Definition: visualizations.h:815
DERIVED SelectAll(std::string selector) const
Definition: selection.h:60
emp::array< Selection, 4 > GenerateNodesAndLinks(Selection svg)
Definition: layout.h:135
D3::Axis< Y_SCALE_TYPE > * GetYAxis()
Definition: visualizations.h:432
Selection Enter()
Definition: selection.h:1188
D3Visualization(const Widget &in)
Definition: visualizations.h:111
Definition: visualizations.h:159
Definition: visualizations.h:768
D3::TileGrid grid
Definition: visualizations.h:232
Y_SCALE_TYPE * y_scale
Definition: visualizations.h:341
D3::ToolTip * GetToolTip()
Definition: visualizations.h:435
void DrawPointsFromDataset()
Draw points and lines for data in this object's dataset object.
Definition: visualizations.h:541
std::deque< DATA_TYPE > data
Definition: visualizations.h:350
D3::LinearScale * x_scale
Definition: visualizations.h:166
std::string to_string(ALL_TYPES &&...all_values)
Definition: string_utils.h:511
REAL_TYPE sfinae_decoy
Definition: meta.h:93
iterator end() noexcept
Definition: vector.h:155
void AddDataPoint(int parent, int child)
Definition: visualizations.h:910
std::function< double(DATA_TYPE)> GetXAccessor()
Definition: visualizations.h:436
std::function< double(DATA_TYPE)> GetScaledX()
Definition: visualizations.h:438
Definition: visualizations.h:41
void SetX(std::string x)
Definition: svg_shapes.h:254
D3::JSONDataset * GetDataset()
Definition: visualizations.h:834
D3::Axis< Y_SCALE_TYPE > y_ax
Definition: visualizations.h:244
int GetHeight() const
Definition: visualizations.h:117
D3::LineGenerator * line_gen
Definition: visualizations.h:344
void SetXAccessor(std::string func)
Definition: visualizations.h:480
D3::LinearScale * y_scale
Definition: visualizations.h:167
virtual void Setup()
Definition: visualizations.h:128
Definition: visualizations.h:764
virtual std::string GetType() override
Definition: visualizations.h:81
D3::CSVDataset * GetDataset()
Definition: visualizations.h:434
void SetDataset(D3::JSONDataset *d)
Definition: visualizations.h:837
void AddDataPoint(int parent, int child)
Definition: visualizations.h:851
DERIVED & SetStyle(std::string name, std::string value, bool priority=false)
Definition: selection.h:284
double ApplyScale(double input)
Calculate the ouput for [input], based on the scale's scaling function.
Definition: scales.h:73
void Redraw(D3::SelectionOrTransition< T > &s)
Definition: visualizations.h:656
D3::Selection exit
Definition: visualizations.h:428
void InitializeVariables()
Definition: visualizations.h:790
virtual ~D3Visualization()
Definition: visualizations.h:112
virtual void Setup()
Definition: visualizations.h:1114
D3::Histogram h
Definition: visualizations.h:246
void LoadDataFromFile(std::string location, std::string callback, bool header=true)
Definition: dataset.h:195
DotPlot(int w=500, int h=500)
Definition: visualizations.h:180
int height
Definition: visualizations.h:49
void Remove()
Definition: selection.h:166
virtual void AddDataPoint(int update, emp::vector< double > &values)
Definition: visualizations.h:209
D3::Axis< X_SCALE_TYPE > x_ax
Definition: visualizations.h:243
Scale & SetRange(emp::array< T, SIZE > values)
Definition: scales.h:38
D3::Selection * GetSVG()
Definition: visualizations.h:118
void SetYAccessor(std::string func)
Definition: visualizations.h:518
void Clear()
Definition: visualizations.h:872
Definition: visualizations.h:240
DERIVED & SetAttr(std::string name, std::string value)
Definition: selection.h:208
void push_back(PB_Ts &&...args)
Definition: vector.h:189
void LoadDataFromFile(std::string filename)
Definition: dataset.h:99
void DrawData(emp::vector< DATA_TYPE > &data)
Definition: visualizations.h:269
D3::Axis< Y_SCALE_TYPE > * y_axis
Definition: visualizations.h:343
constexpr const double PI
pi
Definition: const.h:20
virtual bool IsD3VisualiationInfo() const override
Definition: visualizations.h:61
void SetXScale(X_SCALE_TYPE *scale)
Definition: visualizations.h:442
D3VisualizationInfo & operator=(const D3VisualizationInfo &)=delete
D3::TreeLayout< NODE > tree
Definition: visualizations.h:810
bool init
Definition: visualizations.h:123
void SetDrawCallback(std::string func)
Definition: visualizations.h:142
Catch-all object for storing references to things created in JS.
Definition: d3_init.h:213
virtual void Setup()
Definition: visualizations.h:899
D3VisualizationInfo(D3Visualization *parent, const std::string &in_id="")
Definition: visualizations.h:53
HistogramChart(std::string x_var, int w=800, int h=400)
Definition: visualizations.h:254
void SetTooltipFunction(std::string func)
Definition: visualizations.h:449
data
A set of modifiers are available do describe DataNode.
Definition: DataNode.h:38
Definition: visualizations.h:226
Definition: selection.h:547
D3::JSObject possible_parents
Definition: visualizations.h:895
Definition: dataset.h:189
Selection Select(std::string selector)
Definition: selection.h:1670
void SetXAxis(D3::Axis< X_SCALE_TYPE > *ax)
Definition: visualizations.h:444
Selection & On(std::string type, std::string listener="null", bool capture=false)
Definition: selection.h:1533
void CallDrawCallback()
Definition: visualizations.h:146
Definition: visualizations.h:968
Axis & SetScale(SCALE_TYPE &scale)
Definition: axis.h:150
emp::sfinae_decoy< double, decltype(&T::operator())> Max(T comp)
Definition: dataset.h:48
std::function< double(DATA_TYPE)> GetScaledY()
Definition: visualizations.h:439
Definition: visualizations.h:880
~LineGraph()
Definition: visualizations.h:378
Definition: visualizations.h:963
Definition: visualizations.h:946
Definition: histogram.h:17
Y_SCALE_TYPE * GetYScale()
Definition: visualizations.h:430
static const PrintStr endl("<br>")
Pre-define emp::endl to insert a "<br>" and thus acting like a newline.
void pass_vector_to_cpp(emp::vector< T > &arr, bool recurse=false)
Same as pass_array_to_cpp, but lets you store values in a vector instead.
Definition: js_utils.h:334
Tools for scaling graph axes in D3.
int next_child
Definition: visualizations.h:894
void TriggerJS() override
Definition: visualizations.h:73
Selection EnterAppend(std::string type)
Definition: selection.h:1147
D3::JSONDataset * data
Definition: visualizations.h:811
DERIVED Filter(std::string selector) const
Definition: selection.h:122
X_SCALE_TYPE * GetXScale()
Definition: visualizations.h:429
D3::TreeLayout< NODE > * GetTreeLayout()
Definition: visualizations.h:833
D3::ToolTip * tip
Definition: visualizations.h:345
D3::CSVDataset * dataset
Definition: visualizations.h:347
void SetY(std::string y)
Definition: svg_shapes.h:301
D3::ToolTip * GetToolTip()
Definition: visualizations.h:835
Definition: selection.h:39
const D3VisualizationInfo * Info() const
Definition: visualizations.h:87
Generator for regular old (cartesian) lines.
Definition: svg_shapes.h:187
Transition MakeTransition(std::string name="")
Definition: selection.h:1452
D3::ToolTip * tip
Definition: visualizations.h:170
D3Visualization(int w, int h, const std::string &in_id="")
Definition: visualizations.h:97
Definition: visualizations.h:44
static constexpr type_if< T, std::is_integral > Pow(T base, T p)
A fast (O(log p)) integral-power command.
Definition: math.h:150
void DrawAxes(Axis< SCALE_X_TYPE > &x_axis, Axis< SCALE_Y_TYPE > &y_axis, Selection &selection)
Definition: axis.h:255
Definition: selection.h:936
Tools to build common SVG shapes.
D3::Axis< X_SCALE_TYPE > * GetXAxis()
Definition: visualizations.h:431
D3::LineGenerator * GetLineGenerator()
Definition: visualizations.h:433
void GetLastRow(emp::array< T, N > &arr)
Put the last row of the array into arr.
Definition: dataset.h:237
virtual void GetHTML(std::stringstream &HTML) override
Definition: visualizations.h:63
Selection SelectAll(std::string selector)
Definition: selection.h:1676
Definition: histogram.h:9
void RecordPlacement(int pos)
Definition: visualizations.h:924
iterator begin() noexcept
Definition: vector.h:153
emp::vector< std::string > variables
Definition: visualizations.h:121
D3Visualization(const D3Visualization &in)
Definition: visualizations.h:110
DERIVED & SetClassed(std::string classname, bool value)
Definition: selection.h:400
Scale & SetDomain(emp::array< T, SIZE > values)
Definition: scales.h:52
D3::Axis< D3::LinearScale > * ax
Definition: visualizations.h:168
void AppendNested(std::string json)
Definition: dataset.h:137
Axis & Draw(Selection &selection)
Definition: axis.h:79
If we are in emscripten, make sure to include the header.
Definition: array.h:37
D3::Selection svg
Definition: visualizations.h:51
emp::vector< int > GetLocHistory(int id)
Definition: visualizations.h:1093
void DrawTree()
Definition: visualizations.h:857
virtual ~D3VisualizationInfo()
Definition: visualizations.h:59
double y_margin
Definition: visualizations.h:92
LineGraph(std::string x_var="", std::string y_var="", int w=800, int h=400)
Definition: visualizations.h:373
D3::ToolTip * tip
Definition: visualizations.h:788
void AddDataPoint(DATA_TYPE data_point)
Smoothly (i.e. with animation) add data_point to the graph.
Definition: visualizations.h:602
D3VisualizationInfo * Info()
Definition: visualizations.h:86
BitSet< NUM_BITS1+NUM_BITS2 > join(const BitSet< NUM_BITS1 > &in1, const BitSet< NUM_BITS2 > &in2)
Definition: BitSet.h:586
int width
Definition: visualizations.h:48
void LoadDataFromFile(std::string filename)
Load data from the file at [filename]. Expected to be a CSV dataset.
Definition: visualizations.h:588
void SetLineGenerator(D3::LineGenerator *line)
Definition: visualizations.h:446
#define emp_assert(...)
Definition: assert.h:199
D3::Selection legend
Definition: visualizations.h:961
void DrawData(bool backlog=false)
Definition: visualizations.h:706
void LoadDataFromFile(std::string filename)
Definition: visualizations.h:839
Axis & Rescale(double new_min, double new_max, const D3::SelectionOrTransition< T > &svg)
Definition: axis.h:242
SpatialGridTreeVisualization(int width, int height)
Definition: visualizations.h:1112
double axis_width
Definition: visualizations.h:91
Handle drawing of axes on D3 graphts.
Selection & Move(int x, int y)
Definition: selection.h:1486
int GetWidth() const
Definition: visualizations.h:116
Tools for laying out nodes in D3.
X_SCALE_TYPE * x_scale
Definition: visualizations.h:340
D3Visualization(D3VisualizationInfo *in_info)
Definition: visualizations.h:89
void ExitRemove()
Selection must have an exit selection (i.e. have just had data bound to it).
Definition: selection.h:1204
Histogram & SetDomain(double x, double y)
Definition: histogram.h:29
virtual void Setup()
Definition: visualizations.h:390
void SetYAxis(D3::Axis< Y_SCALE_TYPE > *ax)
Definition: visualizations.h:445
void Clear()
Definition: visualizations.h:750
std::function< double(DATA_TYPE)> GetYAccessor()
Definition: visualizations.h:437
void SetTooltipFunction(std::string func)
Definition: visualizations.h:821
void SetDataset(D3::CSVDataset *d)
Definition: visualizations.h:447
Selection Data(Dataset &values, std::string key="")
Definition: selection.h:1008
TreeVisualization(int width=800, int height=400)
Definition: visualizations.h:813
Selection Append(std::string name)
Append DOM element(s) of the type specified by [name] to this selection.
Definition: selection.h:1417
void SetYScale(Y_SCALE_TYPE *scale)
Definition: visualizations.h:443
Selection DrawShape(emp::array< emp::array< T, 2 >, SIZE > &data, Selection &s)
Definition: svg_shapes.h:58
virtual void Setup()
Definition: visualizations.h:234
Definition: visualizations.h:935
D3Visualization * parent
Definition: visualizations.h:50
Definition: visualizations.h:778
std::string GetID()
Definition: visualizations.h:119
Dataset Call(emp::vector< DATA_TYPE > data)
Definition: histogram.h:69
int GetID() const
Definition: d3_init.h:96
Histogram & Domain(double x, double y)
Definition: histogram.h:34
D3::Selection circles
Definition: visualizations.h:169
std::string draw_data_callback
Callback function for drawing data after rescale animation.
Definition: visualizations.h:126
TreeVisualizationReplacement(int width, int height)
Definition: visualizations.h:897
int next_pos
Definition: visualizations.h:892
virtual void Setup()
Definition: visualizations.h:259
Definition: visual_elements.h:16
SCALE_TYPE & GetScale()
Get a reference to this object's scale.
Definition: axis.h:160
D3::Axis< X_SCALE_TYPE > * x_axis
Definition: visualizations.h:342
void RecordParent(int parent, int child)
Definition: visualizations.h:929
Definition: visualizations.h:331