diff --git a/addons/easy_charts/PieChart/pie_chart.gd b/addons/easy_charts/PieChart/pie_chart.gd index efe2ed1..5dcff66 100644 --- a/addons/easy_charts/PieChart/pie_chart.gd +++ b/addons/easy_charts/PieChart/pie_chart.gd @@ -108,15 +108,15 @@ func plot_placeholder() -> void: ] plot_from_array(data) -func structure_datas(database: Array, are_values_columns: bool, x_values_index: int): - # @x_values_index can be either a column or a row relative to x values +func structure_datas(database: Array): + # @labels_index can be either a column or a row relative to x values clean_variables() - self.are_values_columns = are_values_columns + are_values_columns = invert_chart != are_values_columns if are_values_columns: for row in database.size(): var t_vals: Array for column in database[row].size(): - if column == x_values_index: + if column == labels_index: var x_data = database[row][column] if x_data.is_valid_float() or x_data.is_valid_integer(): x_datas.append(x_data as float) @@ -136,7 +136,7 @@ func structure_datas(database: Array, are_values_columns: bool, x_values_index: x_label = str(x_datas.pop_front()) else: for row in database.size(): - if row == x_values_index: + if row == labels_index: x_datas = (database[row]) x_label = x_datas.pop_front() as String else: diff --git a/addons/easy_charts/RadarChart/radar_chart.gd b/addons/easy_charts/RadarChart/radar_chart.gd index 6f7bd29..c2c2391 100644 --- a/addons/easy_charts/RadarChart/radar_chart.gd +++ b/addons/easy_charts/RadarChart/radar_chart.gd @@ -125,11 +125,10 @@ func _get_property_list(): }, ] -func structure_datas(database : Array, are_values_columns : bool, labels_index : int): +func structure_datas(database : Array): # @x_values_index can be either a column or a row relative to x values # @y_values can be either a column or a row relative to y values - self.labels_index = labels_index - self.are_values_columns = are_values_columns + are_values_columns = invert_chart != are_values_columns match are_values_columns: true: for row in database.size(): diff --git a/addons/easy_charts/ScatterChart/ScatterChart.gd b/addons/easy_charts/ScatterChart/ScatterChart.gd deleted file mode 100644 index edbb97f..0000000 --- a/addons/easy_charts/ScatterChart/ScatterChart.gd +++ /dev/null @@ -1,343 +0,0 @@ -tool -extends Chart -class_name ScatterChart - -""" -[ScatterChart] - General purpose node for Scatter Charts - -A scatter plot (also called a scatterplot, scatter graph, scatter chart, scattergram, or scatter diagram) - is a type of plot or mathematical diagram using Cartesian coordinates to display values for typically two variables -for a set of data. If the points are coded (color/shape/size), one additional variable can be displayed. -The data are displayed as a collection of points, each having the value of one variable determining the position on -the horizontal axis and the value of the other variable determining the position on the vertical axis. - -/ source : Wikipedia / -""" - -# --------------------- - -func _get_property_list(): - return [ - # Chart Properties - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Properties/are_values_columns", - "type": TYPE_BOOL - }, - { - "hint": PROPERTY_HINT_RANGE, - "hint_string": "-1,100,1", - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Properties/labels_index", - "type": TYPE_INT - }, - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Properties/show_x_values_as_labels", - "type": TYPE_BOOL - }, - - # Chart Display - { - "hint": PROPERTY_HINT_RANGE, - "hint_string": "0.1,10", - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Display/x_decim", - "type": TYPE_REAL - }, - { - "hint": PROPERTY_HINT_RANGE, - "hint_string": "0.1,10", - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Display/y_decim", - "type": TYPE_REAL - }, - - # Chart Style - { - "hint": 24, - "hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM, - PoolStringArray(PointShapes.keys()).join(",")], - "name": "Chart_Style/points_shape", - "type": TYPE_ARRAY, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE - }, - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/function_colors", - "type": TYPE_COLOR_ARRAY - }, - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/box_color", - "type": TYPE_COLOR - }, - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/v_lines_color", - "type": TYPE_COLOR - }, - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/h_lines_color", - "type": TYPE_COLOR - }, - { - "class_name": "Font", - "hint": PROPERTY_HINT_RESOURCE_TYPE, - "hint_string": "Font", - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/font", - "type": TYPE_OBJECT - }, - { - "class_name": "Font", - "hint": PROPERTY_HINT_RESOURCE_TYPE, - "hint_string": "Font", - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/bold_font", - "type": TYPE_OBJECT - }, - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/font_color", - "type": TYPE_COLOR - }, - { - "hint": PROPERTY_HINT_ENUM, - "hint_string": PoolStringArray(Utilities.templates.keys()).join(","), - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Style/template", - "type": TYPE_INT - }, - - # Chart Modifiers - { - "hint": PROPERTY_HINT_NONE, - "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, - "name": "Chart_Modifiers/invert_chart", - "type": TYPE_BOOL - }, - ] - -func structure_datas(database : Array, are_values_columns : bool, x_values_index : int): - # @x_values_index can be either a column or a row relative to x values - # @y_values can be either a column or a row relative to y values - self.are_values_columns = are_values_columns - match are_values_columns: - true: - for row in database.size(): - var t_vals : Array - for column in database[row].size(): - if column == x_values_index: - var x_data = database[row][column] - if x_data.is_valid_float() or x_data.is_valid_integer(): - x_datas.append(x_data as float) - else: - x_datas.append(x_data.replace(",",".") as float) - else: - if row != 0: - var y_data = database[row][column] - if y_data.is_valid_float() or y_data.is_valid_integer(): - t_vals.append(y_data as float) - else: - t_vals.append(y_data.replace(",",".") as float) - else: - y_labels.append(str(database[row][column])) - if not t_vals.empty(): - y_datas.append(t_vals) - x_label = str(x_datas.pop_front()) - false: - for row in database.size(): - if row == x_values_index: - x_datas = (database[row]) - x_label = x_datas.pop_front() as String - else: - var values = database[row] as Array - y_labels.append(values.pop_front() as String) - y_datas.append(values) - for data in y_datas: - for value in data.size(): - data[value] = data[value] as float - - # draw y labels - var to_order : Array - var to_order_min : Array - for cluster in y_datas.size(): - # define x_chors and y_chors - var ordered_cluster = y_datas[cluster] as Array - ordered_cluster.sort() - ordered_cluster = PoolIntArray(ordered_cluster) - var margin_max = ordered_cluster[ordered_cluster.size()-1] - var margin_min = ordered_cluster[0] - to_order.append(margin_max) - to_order_min.append(margin_min) - - to_order.sort() - to_order_min.sort() - var margin = to_order.pop_back() - if not origin_at_zero: - y_margin_min = to_order_min.pop_front() - v_dist = y_decim * pow(10.0,str(margin).length()-2) - var multi = 0 - var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0) - y_chors.append(p as String) - while p < margin: - multi+=1 - p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0) - y_chors.append(p as String) - - # draw x_labels - if not show_x_values_as_labels: - to_order.clear() - to_order = x_datas as PoolIntArray - - to_order.sort() - margin = to_order.pop_back() - if not origin_at_zero: - x_margin_min = to_order.pop_front() - h_dist = x_decim * pow(10.0,str(margin).length()-2) - multi = 0 - p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0) - x_labels.append(p as String) - while p < margin: - multi+=1 - p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0) - x_labels.append(p as String) - -func build_chart(): - SIZE = get_size() - origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y) - -func calculate_pass(): - if invert_chart: - x_chors = y_labels as PoolStringArray - else: - if show_x_values_as_labels: - x_chors = x_datas as PoolStringArray - else: - x_chors = x_labels - - # calculate distance in pixel between 2 consecutive values/datas - x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1) - y_pass = origin.y / (y_chors.size()-1) - -func calculate_coordinates(): - x_coordinates.clear() - y_coordinates.clear() - point_values.clear() - point_positions.clear() - - if invert_chart: - for column in y_datas[0].size(): - var single_coordinates : Array - for row in y_datas: - if origin_at_zero: - single_coordinates.append((row[column]*y_pass)/v_dist) - else: - single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist) - y_coordinates.append(single_coordinates) - else: - for cluster in y_datas: - var single_coordinates : Array - for value in cluster.size(): - if origin_at_zero: - single_coordinates.append((cluster[value]*y_pass)/v_dist) - else: - single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist) - y_coordinates.append(single_coordinates) - - if show_x_values_as_labels: - for x in x_datas.size(): - x_coordinates.append(x_pass*x) - else: - for x in x_datas.size(): - if origin_at_zero: - if invert_chart: - x_coordinates.append(x_pass*x) - else: - x_coordinates.append(x_datas[x]*x_pass/h_dist) - else: - x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist) - - for f in functions: - point_values.append([]) - point_positions.append([]) - - if invert_chart: - for function in y_coordinates.size(): - for function_value in y_coordinates[function].size(): - if are_values_columns: - point_positions[function_value].append(Vector2(x_coordinates[function]+origin.x, origin.y-y_coordinates[function][function_value])) - point_values[function_value].append([x_datas[function_value],y_datas[function_value][function]]) - else: - point_positions[function].append(Vector2(x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value])) - point_values[function].append([x_datas[function_value],y_datas[function_value][function]]) - else: - for cluster in y_coordinates.size(): - for y in y_coordinates[cluster].size(): - if are_values_columns: - point_values[y].append([x_datas[cluster],y_datas[cluster][y]]) - point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y])) - else: - point_values[cluster].append([x_datas[y],y_datas[cluster][y]]) - point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y])) - -func _draw(): - clear_points() - - draw_grid() - draw_chart_outlines() - - var defined_colors : bool = false - if function_colors.size(): - defined_colors = true - - for _function in point_values.size(): - var PointContainer : Control = Control.new() - Points.add_child(PointContainer) - - for function_point in point_values[_function].size(): - var point : Point = point_node.instance() - point.connect("_point_pressed",self,"point_pressed") - point.connect("_mouse_entered",self,"show_data") - point.connect("_mouse_exited",self,"hide_data") - - point.create_point(points_shape[_function], function_colors[function_point if invert_chart else _function], - Color.white, point_positions[_function][function_point], - point.format_value(point_values[_function][function_point], false, false), - y_labels[function_point if invert_chart else _function] as String) - - PointContainer.add_child(point) - -func draw_grid(): - # ascisse - for p in x_chors.size(): - var point : Vector2 = origin+Vector2((p)*x_pass,0) - # v grid - draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true) - # ascisse - draw_line(point-Vector2(0,5),point,v_lines_color,1,true) - draw_string(font,point+Vector2(-const_width/2*x_chors[p].length(),font_size+const_height),x_chors[p],font_color) - - # ordinate - for p in y_chors.size(): - var point : Vector2 = origin-Vector2(0,(p)*y_pass) - # h grid - draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true) - # ordinate - draw_line(point,point+Vector2(5,0),h_lines_color,1,true) - draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,-const_height),y_chors[p],font_color) - -func draw_chart_outlines(): - draw_line(origin,SIZE-Vector2(0,OFFSET.y),box_color,1,true) - draw_line(origin,Vector2(OFFSET.x,0),box_color,1,true) - draw_line(Vector2(OFFSET.x,0),Vector2(SIZE.x,0),box_color,1,true) - draw_line(Vector2(SIZE.x,0),SIZE-Vector2(0,OFFSET.y),box_color,1,true) diff --git a/addons/easy_charts/ScatterChart/ScatterChart.tscn b/addons/easy_charts/ScatterChart/ScatterChart.tscn index ba5579d..ff0225e 100644 --- a/addons/easy_charts/ScatterChart/ScatterChart.tscn +++ b/addons/easy_charts/ScatterChart/ScatterChart.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=2] [ext_resource path="res://addons/easy_charts/Utilities/Point/PointData.tscn" type="PackedScene" id=1] -[ext_resource path="res://addons/easy_charts/ScatterChart/ScatterChart.gd" type="Script" id=2] +[ext_resource path="res://addons/easy_charts/ScatterChart/scatter_chart.gd" type="Script" id=2] [sub_resource type="Theme" id=1] @@ -75,11 +75,10 @@ __meta__ = { [node name="PointData" parent="." instance=ExtResource( 1 )] [node name="PointData" parent="PointData" index="0"] -visible = false -margin_left = 58.5211 -margin_top = -187.685 -margin_right = 58.3851 -margin_bottom = -186.885 +margin_left = -311.73 +margin_top = -167.672 +margin_right = -311.866 +margin_bottom = -166.872 theme = SubResource( 1 ) [editable path="PointData"] diff --git a/addons/easy_charts/ScatterChart/scatter_chart.gd b/addons/easy_charts/ScatterChart/scatter_chart.gd new file mode 100644 index 0000000..8d5b283 --- /dev/null +++ b/addons/easy_charts/ScatterChart/scatter_chart.gd @@ -0,0 +1,317 @@ +tool +extends Chart +class_name ScatterChart + +""" +[ScatterChart] - General purpose node for Scatter Charts + +A scatter plot (also called a scatterplot, scatter graph, scatter chart, scattergram, or scatter diagram) + is a type of plot or mathematical diagram using Cartesian coordinates to display values for typically two variables +for a set of data. If the points are coded (color/shape/size), one additional variable can be displayed. +The data are displayed as a collection of points, each having the value of one variable determining the position on +the horizontal axis and the value of the other variable determining the position on the vertical axis. + +/ source : Wikipedia / +""" + +# --------------------- + +func _get_property_list(): + return [ + # Chart Properties + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/are_values_columns", + "type": TYPE_BOOL + }, + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "-1,100,1", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/labels_index", + "type": TYPE_INT + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Properties/show_x_values_as_labels", + "type": TYPE_BOOL + }, + + # Chart Display + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0.1,10", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Display/x_decim", + "type": TYPE_REAL + }, + { + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0.1,10", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Display/y_decim", + "type": TYPE_REAL + }, + + # Chart Style + { + "hint": 24, + "hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM, + PoolStringArray(PointShapes.keys()).join(",")], + "name": "Chart_Style/points_shape", + "type": TYPE_ARRAY, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/function_colors", + "type": TYPE_COLOR_ARRAY + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/box_color", + "type": TYPE_COLOR + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/v_lines_color", + "type": TYPE_COLOR + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/h_lines_color", + "type": TYPE_COLOR + }, + { + "class_name": "Font", + "hint": PROPERTY_HINT_RESOURCE_TYPE, + "hint_string": "Font", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/font", + "type": TYPE_OBJECT + }, + { + "class_name": "Font", + "hint": PROPERTY_HINT_RESOURCE_TYPE, + "hint_string": "Font", + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/bold_font", + "type": TYPE_OBJECT + }, + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/font_color", + "type": TYPE_COLOR + }, + { + "hint": PROPERTY_HINT_ENUM, + "hint_string": PoolStringArray(Utilities.templates.keys()).join(","), + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Style/template", + "type": TYPE_INT + }, + + # Chart Modifiers + { + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE, + "name": "Chart_Modifiers/invert_chart", + "type": TYPE_BOOL + }, + ] + +func structure_datas(database : Array): + # @labels_index can be either a column or a row relative to x values + # @y_values can be either a column or a row relative to y values + are_values_columns = invert_chart != are_values_columns + match are_values_columns: + true: + for row in database.size(): + var t_vals : Array + for column in database[row].size(): + if column == labels_index: + var x_data = database[row][column] + if x_data.is_valid_float() or x_data.is_valid_integer(): + x_datas.append(x_data as float) + else: + x_datas.append(x_data.replace(",",".") as float) + else: + if row != 0: + var y_data = database[row][column] + if y_data.is_valid_float() or y_data.is_valid_integer(): + t_vals.append(y_data as float) + else: + t_vals.append(y_data.replace(",",".") as float) + else: + y_labels.append(str(database[row][column])) + if not t_vals.empty(): + y_datas.append(t_vals) + x_label = str(x_datas.pop_front()) + false: + for row in database.size(): + if row == labels_index: + x_datas = (database[row]) + x_label = x_datas.pop_front() as String + else: + var values = database[row] as Array + y_labels.append(values.pop_front() as String) + y_datas.append(values) + for data in y_datas: + for value in data.size(): + data[value] = data[value] as float + + # draw y labels + var to_order : Array + var to_order_min : Array + for cluster in y_datas.size(): + # define x_chors and y_chors + var ordered_cluster = y_datas[cluster] as Array + ordered_cluster.sort() + ordered_cluster = PoolIntArray(ordered_cluster) + var margin_max = ordered_cluster[ordered_cluster.size()-1] + var margin_min = ordered_cluster[0] + to_order.append(margin_max) + to_order_min.append(margin_min) + + to_order.sort() + to_order_min.sort() + var margin = to_order.pop_back() + if not origin_at_zero: + y_margin_min = to_order_min.pop_front() + v_dist = y_decim * pow(10.0,str(margin).length()-2) + var multi = 0 + var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0) + y_chors.append(p as String) + while p < margin: + multi+=1 + p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0) + y_chors.append(p as String) + + # draw x_labels + if not show_x_values_as_labels: + to_order.clear() + to_order = x_datas as PoolIntArray + + to_order.sort() + margin = to_order.pop_back() + if not origin_at_zero: + x_margin_min = to_order.pop_front() + h_dist = x_decim * pow(10.0,str(margin).length()-2) + multi = 0 + p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0) + x_labels.append(p as String) + while p < margin: + multi+=1 + p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0) + x_labels.append(p as String) + +func build_chart(): + SIZE = get_size() + origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y) + +func calculate_pass(): + if show_x_values_as_labels: + x_chors = x_datas as PoolStringArray + else: + x_chors = x_labels + + # calculate distance in pixel between 2 consecutive values/datas + x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1) + y_pass = origin.y / (y_chors.size()-1) + +func calculate_coordinates(): + x_coordinates.clear() + y_coordinates.clear() + point_values.clear() + point_positions.clear() + + for cluster in y_datas: + var single_coordinates : Array + for value in cluster.size(): + if origin_at_zero: + single_coordinates.append((cluster[value]*y_pass)/v_dist) + else: + single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist) + y_coordinates.append(single_coordinates) + + if show_x_values_as_labels: + for x in x_datas.size(): + x_coordinates.append(x_pass*x) + else: + for x in x_datas.size(): + if origin_at_zero: + x_coordinates.append(x_datas[x]*x_pass/h_dist) + else: + x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist) + + for f in functions: + point_values.append([]) + point_positions.append([]) + + for cluster in y_coordinates.size(): + for y in y_coordinates[cluster].size(): + if are_values_columns: + point_values[y].append([x_datas[cluster],y_datas[cluster][y]]) + point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y])) + else: + point_values[cluster].append([x_datas[y],y_datas[cluster][y]]) + point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y])) + +func _draw(): + clear_points() + + draw_grid() + draw_chart_outlines() + + var defined_colors : bool = false + if function_colors.size(): + defined_colors = true + + for _function in point_values.size(): + var PointContainer : Control = Control.new() + Points.add_child(PointContainer) + + for function_point in point_values[_function].size(): + var point : Point = point_node.instance() + point.connect("_point_pressed",self,"point_pressed") + point.connect("_mouse_entered",self,"show_data") + point.connect("_mouse_exited",self,"hide_data") + + point.create_point(points_shape[_function], function_colors[_function], + Color.white, point_positions[_function][function_point], + point.format_value(point_values[_function][function_point], false, false), + y_labels[_function] as String) + + PointContainer.add_child(point) + +func draw_grid(): + # ascisse + for p in x_chors.size(): + var point : Vector2 = origin+Vector2((p)*x_pass,0) + # v grid + draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true) + # ascisse + draw_line(point-Vector2(0,5),point,v_lines_color,1,true) + draw_string(font,point+Vector2(-const_width/2*x_chors[p].length(),font_size+const_height),x_chors[p],font_color) + + # ordinate + for p in y_chors.size(): + var point : Vector2 = origin-Vector2(0,(p)*y_pass) + # h grid + draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true) + # ordinate + draw_line(point,point+Vector2(5,0),h_lines_color,1,true) + draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,-const_height),y_chors[p],font_color) + +func draw_chart_outlines(): + draw_line(origin,SIZE-Vector2(0,OFFSET.y),box_color,1,true) + draw_line(origin,Vector2(OFFSET.x,0),box_color,1,true) + draw_line(Vector2(OFFSET.x,0),Vector2(SIZE.x,0),box_color,1,true) + draw_line(Vector2(SIZE.x,0),SIZE-Vector2(0,OFFSET.y),box_color,1,true) diff --git a/addons/easy_charts/file.samples/scatter.csv b/addons/easy_charts/file.samples/scatter (columns).csv similarity index 97% rename from addons/easy_charts/file.samples/scatter.csv rename to addons/easy_charts/file.samples/scatter (columns).csv index 20fb926..8143bf9 100644 --- a/addons/easy_charts/file.samples/scatter.csv +++ b/addons/easy_charts/file.samples/scatter (columns).csv @@ -1,101 +1,101 @@ -x;y1;y2 -50,05732879;116,61234;90,55501121 -53,23295081;105,6457011;47,41275029 -47,28686102;95,61795061;36,33108959 -53,0250493;106,4552515;85,4302022 -57,10271278;111,9088163;39,80610352 -40,71992494;78,27201391;79,55208897 -55,62752569;122,7859036;94,15837791 -54,17819455;107,9817124;39,80351785 -40,8610371;107,92736;61,0663229 -54,06159551;110,0647495;93,00315399 -64,35130431;134,5556319;114,2043276 -49,29181834;88,18806126;64,89624292 -44,63823505;102,8364528;108,1982178 -58,62487836;126,0319541;78,40707574 -55,78566879;95,81224088;75,02657209 -50,76570445;94,73143882;39,96573437 -48,45339259;92,86957776;88,41618517 -49,40446173;70,21723661;9,81277488 -48,34604978;97,87616091;40,53011113 -43,62470151;103,7308337;97,10613219 -50,8877046;117,1558657;62,2681611 -52,25082012;103,3922334;79,14141328 -50,35929987;87,68936817;19,3300683 -46,42761861;90,1655428;67,73792419 -55,67926036;93,17073084;69,49147048 -61,72779383;142,8458546;106,1180608 -58,99808851;102,3529041;27,35481559 -43,6620999;77,36405233;17,70195243 -55,42639088;121,0878726;78,66148172 -58,79311097;111,8698686;49,07675763 -50,71073988;106,5406487;97,82990882 -45,57346035;104,7456111;56,17215075 -45,7981314;83,9963622;75,1982308 -46,46484131;82,94617575;77,48133444 -57,9492853;144,9994608;129,0501755 -48,3999722;72,83510082;30,43512862 -54,2097076;114,7785416;82,568834 -46,67548966;95,25014621;37,57465655 -38,21698894;88,21423442;64,99724548 -51,95614673;90,93548401;66,97933728 -51,22522594;105,1106925;101,8854666 -52,84741658;105,0503069;75,20289032 -54,78984594;109,9873973;87,19755136 -52,00296104;101,442706;89,43974496 -51,43150193;88,40178257;36,97028064 -47,40407943;89,44141735;55,03733792 -51,6749185;96,54147702;31,86655852 -40,74049925;83,85842913;79,11792988 -49,82155418;112,9093356;96,08778142 -57,57763531;115,7709369;72,19330159 -51,49652924;127,9054098;118,4088806 -53,10710725;112,6337002;90,52659295 -42,93645994;102,8111834;102,8747235 -44,14066275;78,88897631;41,74831356 -46,60936983;98,64046333;54,0310935 -47,41415307;95,89594769;58,48179462 -47,99032677;106,3655192;102,3751924 -50,68360992;106,9507457;44,26713578 -50,57070899;83,19613908;61,62543009 -57,14992785;115,5596634;40,40973555 -50,45105658;97,6950217;64,24396512 -46,76779029;99,20006513;60,43227484 -50,49802495;99,43092076;87,93289581 -51,52523583;84,24653091;17,72129508 -40,72692657;102,1715902;67,44466363 -54,96034411;111,5346596;82,57431549 -48,86213774;101,4305303;58,56839256 -52,76166432;108,021472;60,25980768 -55,46249302;83,51709356;51,05460054 -51,78186354;79,45870906;11,67684552 -54,7256505;108,6386184;58,9129679 -55,03288163;112,1224042;72,08952257 -52,83806054;104,53718;101,6991195 -45,86692682;91,39643691;29,52951009 -49,67284006;110,1908352;88,51799514 -53,18552185;119,0135337;113,8280119 -41,69070011;62,78988486;53,09918475 -53,36320564;118,5841731;108,2209675 -44,27369117;74,58882658;69,31513541 -49,92198979;76,93363417;52,01164438 -44,91221355;82,33766098;44,42544743 -37,92316535;68,0076039;17,08443855 -50,10889447;103,6209931;49,51209863 -44,20348231;84,19989748;57,99641517 -57,11433271;102,0528226;84,93848989 -41,90764861;109,1360517;50,22840309 -51,88278094;89,01870776;69,13592682 -44,31355843;81,19982464;76,88626621 -44,25547817;72,64564157;53,3901634 -48,93179315;107,7773458;40,84555265 -39,36849865;59,39799005;68,0294914 -53,33338181;99,04871654;92,71533473 -61,63696872;129,3884947;76,75152598 -46,40148646;102,9511032;92,54961674 -43,81949012;75,15673812;44,337248 -53,78046359;85,87008695;50,08962336 -41,27977392;60,49700348;50,21722956 -52,32206122;106,8462547;57,52419348 -41,36660384;105,0465099;78,67990606 -47,62423286;96,62455823;84,00032537 +x;y1;y2 +50,05732879;116,61234;90,55501121 +53,23295081;105,6457011;47,41275029 +47,28686102;95,61795061;36,33108959 +53,0250493;106,4552515;85,4302022 +57,10271278;111,9088163;39,80610352 +40,71992494;78,27201391;79,55208897 +55,62752569;122,7859036;94,15837791 +54,17819455;107,9817124;39,80351785 +40,8610371;107,92736;61,0663229 +54,06159551;110,0647495;93,00315399 +64,35130431;134,5556319;114,2043276 +49,29181834;88,18806126;64,89624292 +44,63823505;102,8364528;108,1982178 +58,62487836;126,0319541;78,40707574 +55,78566879;95,81224088;75,02657209 +50,76570445;94,73143882;39,96573437 +48,45339259;92,86957776;88,41618517 +49,40446173;70,21723661;9,81277488 +48,34604978;97,87616091;40,53011113 +43,62470151;103,7308337;97,10613219 +50,8877046;117,1558657;62,2681611 +52,25082012;103,3922334;79,14141328 +50,35929987;87,68936817;19,3300683 +46,42761861;90,1655428;67,73792419 +55,67926036;93,17073084;69,49147048 +61,72779383;142,8458546;106,1180608 +58,99808851;102,3529041;27,35481559 +43,6620999;77,36405233;17,70195243 +55,42639088;121,0878726;78,66148172 +58,79311097;111,8698686;49,07675763 +50,71073988;106,5406487;97,82990882 +45,57346035;104,7456111;56,17215075 +45,7981314;83,9963622;75,1982308 +46,46484131;82,94617575;77,48133444 +57,9492853;144,9994608;129,0501755 +48,3999722;72,83510082;30,43512862 +54,2097076;114,7785416;82,568834 +46,67548966;95,25014621;37,57465655 +38,21698894;88,21423442;64,99724548 +51,95614673;90,93548401;66,97933728 +51,22522594;105,1106925;101,8854666 +52,84741658;105,0503069;75,20289032 +54,78984594;109,9873973;87,19755136 +52,00296104;101,442706;89,43974496 +51,43150193;88,40178257;36,97028064 +47,40407943;89,44141735;55,03733792 +51,6749185;96,54147702;31,86655852 +40,74049925;83,85842913;79,11792988 +49,82155418;112,9093356;96,08778142 +57,57763531;115,7709369;72,19330159 +51,49652924;127,9054098;118,4088806 +53,10710725;112,6337002;90,52659295 +42,93645994;102,8111834;102,8747235 +44,14066275;78,88897631;41,74831356 +46,60936983;98,64046333;54,0310935 +47,41415307;95,89594769;58,48179462 +47,99032677;106,3655192;102,3751924 +50,68360992;106,9507457;44,26713578 +50,57070899;83,19613908;61,62543009 +57,14992785;115,5596634;40,40973555 +50,45105658;97,6950217;64,24396512 +46,76779029;99,20006513;60,43227484 +50,49802495;99,43092076;87,93289581 +51,52523583;84,24653091;17,72129508 +40,72692657;102,1715902;67,44466363 +54,96034411;111,5346596;82,57431549 +48,86213774;101,4305303;58,56839256 +52,76166432;108,021472;60,25980768 +55,46249302;83,51709356;51,05460054 +51,78186354;79,45870906;11,67684552 +54,7256505;108,6386184;58,9129679 +55,03288163;112,1224042;72,08952257 +52,83806054;104,53718;101,6991195 +45,86692682;91,39643691;29,52951009 +49,67284006;110,1908352;88,51799514 +53,18552185;119,0135337;113,8280119 +41,69070011;62,78988486;53,09918475 +53,36320564;118,5841731;108,2209675 +44,27369117;74,58882658;69,31513541 +49,92198979;76,93363417;52,01164438 +44,91221355;82,33766098;44,42544743 +37,92316535;68,0076039;17,08443855 +50,10889447;103,6209931;49,51209863 +44,20348231;84,19989748;57,99641517 +57,11433271;102,0528226;84,93848989 +41,90764861;109,1360517;50,22840309 +51,88278094;89,01870776;69,13592682 +44,31355843;81,19982464;76,88626621 +44,25547817;72,64564157;53,3901634 +48,93179315;107,7773458;40,84555265 +39,36849865;59,39799005;68,0294914 +53,33338181;99,04871654;92,71533473 +61,63696872;129,3884947;76,75152598 +46,40148646;102,9511032;92,54961674 +43,81949012;75,15673812;44,337248 +53,78046359;85,87008695;50,08962336 +41,27977392;60,49700348;50,21722956 +52,32206122;106,8462547;57,52419348 +41,36660384;105,0465099;78,67990606 +47,62423286;96,62455823;84,00032537 diff --git a/addons/easy_charts/file.samples/scatter (columns).csv.import b/addons/easy_charts/file.samples/scatter (columns).csv.import new file mode 100644 index 0000000..997c493 --- /dev/null +++ b/addons/easy_charts/file.samples/scatter (columns).csv.import @@ -0,0 +1,10 @@ +[remap] + +importer="csv" +type="TextFile" + +[deps] + +source_file="res://addons/easy_charts/file.samples/scatter (columns).csv" +[params] +