Add some style representation customization

Width of the grid and function lines.

Made drawing points for LineChart optional (especially useful when using a huge number of points to avoid overclustering). For this I had to rewrite the draw_lines function to work similar to draw_points using point_positions instead of information of the point nodes.

The string position of the labels is correctly calculated now. It uses a new variable: label_displacement so it don't look too close to the axis and the border.

Set some default values  that make more sense to the instanciable scenes.
This commit is contained in:
Jorge 2021-03-25 03:06:55 +01:00
parent 25e97a683e
commit 1d31b3a7dc
5 changed files with 121 additions and 50 deletions

View File

@ -14,29 +14,77 @@ class_name LineChart
# In these cases they are known as run charts.
# Source: Wikipedia
var show_points := true
var function_line_width : int = 2
func build_property_list():
.build_property_list()
property_list.append(
{
"hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Display/show_points",
"type": TYPE_BOOL
})
#Find first element of Chart Display
var position
for i in property_list.size():
if property_list[i]["name"].find("Chart_Style") != -1: #Found
position = i
break
property_list.insert(position + 2, #I want it to be below point shape and function colors
{
"hint": PROPERTY_HINT_RANGE,
"hint_string": "1, 100, 1",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/function_line_width",
"type": TYPE_INT
})
func _get_property_list():
property_list[0].name = "LineChart"
return property_list
func _get(property):
match property:
"Chart_Display/show_points":
return show_points
"Chart_Style/function_line_width":
return function_line_width
func _set(property, value):
match property:
"Chart_Display/show_points":
show_points = value
return true
"Chart_Style/function_line_width":
function_line_width = value
return true
func _draw():
clear_points()
draw_grid()
draw_chart_outlines()
draw_points()
if show_points:
draw_points()
draw_lines()
draw_treshold()
func draw_lines():
var _function = 0
for PointContainer in Points.get_children(): #Each function is stored in a different PointContainer
for function_point in range(1, PointContainer.get_children().size()):
for function in point_values.size():
for function_point in range(1, point_values[function].size()):
draw_line(
point_positions[_function][function_point - 1],
point_positions[_function][function_point],
function_colors[_function],
2,
false)
_function += 1
point_positions[function][function_point - 1],
point_positions[function][function_point],
function_colors[function],
function_line_width,
false)

View File

@ -3,7 +3,6 @@
[ext_resource path="res://addons/easy_charts/Utilities/Point/point_data.tscn" type="PackedScene" id=1]
[ext_resource path="res://addons/easy_charts/LineChart/line_chart.gd" type="Script" id=4]
[sub_resource type="Theme" id=1]
[node name="LineChart" type="Control"]
@ -27,12 +26,16 @@ In these cases they are known as run charts."
}
Chart_Properties/are_values_columns = false
Chart_Properties/labels_index = 0
Chart_Properties/show_x_values_as_labels = true
Chart_Display/x_decim = 5.0
Chart_Properties/show_x_values_as_labels = false
Chart_Display/autoscale_x = true
Chart_Display/x_decim = 1.0
Chart_Display/autoscale_y = true
Chart_Display/y_decim = 1.0
Chart_Style/points_shape = [ 0 ]
Chart_Style/function_colors = [ Color( 0.117647, 0.117647, 0.117647, 1 ) ]
Chart_Style/points_shape = [ ]
Chart_Style/function_colors = PoolColorArray( 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1 )
Chart_Style/function_line_width = 2
Chart_Style/box_color = Color( 0.117647, 0.117647, 0.117647, 1 )
Chart_Style/grid_lines_width = 1
Chart_Style/v_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
Chart_Style/h_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
Chart_Style/font = null
@ -43,6 +46,7 @@ Chart_Style/template = 0
Chart_Modifiers/treshold = Vector2( 0, 0 )
Chart_Modifiers/only_disp_values = Vector2( 0, 0 )
Chart_Modifiers/invert_chart = false
Chart_Display/show_points = true
[node name="Background" type="ColorRect" parent="."]
visible = false
@ -82,10 +86,10 @@ __meta__ = {
[node name="PointData" parent="." instance=ExtResource( 1 )]
[node name="PointData" parent="PointData" index="0"]
margin_left = -257.531
margin_top = -244.08
margin_right = -257.667
margin_bottom = -243.28
margin_left = -458.75
margin_top = -164.504
margin_right = -458.886
margin_bottom = -163.704
theme = SubResource( 1 )
[editable path="PointData"]

View File

@ -3,7 +3,6 @@
[ext_resource path="res://addons/easy_charts/Utilities/Point/point_data.tscn" type="PackedScene" id=1]
[ext_resource path="res://addons/easy_charts/ScatterChart/scatter_chart.gd" type="Script" id=2]
[sub_resource type="Theme" id=1]
[node name="ScatterChart" type="Control"]
@ -24,18 +23,24 @@ the horizontal axis and the value of the other variable determining the position
}
Chart_Properties/are_values_columns = false
Chart_Properties/labels_index = 0
Chart_Properties/show_x_values_as_labels = true
Chart_Display/x_decim = 5.0
Chart_Display/y_decim = 5.0
Chart_Style/points_shape = [ 0 ]
Chart_Style/function_colors = PoolColorArray( 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1 )
Chart_Properties/show_x_values_as_labels = false
Chart_Display/autoscale_x = true
Chart_Display/x_decim = 1.0
Chart_Display/autoscale_y = true
Chart_Display/y_decim = 1.0
Chart_Style/points_shape = [ ]
Chart_Style/function_colors = PoolColorArray( )
Chart_Style/box_color = Color( 0.117647, 0.117647, 0.117647, 1 )
Chart_Style/grid_lines_width = 1
Chart_Style/v_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
Chart_Style/h_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
Chart_Style/font = null
Chart_Style/bold_font = null
Chart_Style/font_color = Color( 0.117647, 0.117647, 0.117647, 1 )
Chart_Style/use_template = true
Chart_Style/template = 0
Chart_Modifiers/treshold = Vector2( 0, 0 )
Chart_Modifiers/only_disp_values = Vector2( 0, 0 )
Chart_Modifiers/invert_chart = false
[node name="Background" type="ColorRect" parent="."]
@ -76,10 +81,10 @@ __meta__ = {
[node name="PointData" parent="." instance=ExtResource( 1 )]
[node name="PointData" parent="PointData" index="0"]
margin_left = -311.73
margin_top = -167.672
margin_right = -311.866
margin_bottom = -166.872
margin_left = -510.384
margin_top = -148.79
margin_right = -510.52
margin_bottom = -147.99
theme = SubResource( 1 )
[editable path="PointData"]

View File

@ -101,6 +101,7 @@ var points_shape : Array = [PointShapes.Dot] setget set_points_shape
var function_colors = [Color("#1e1e1e")] setget set_function_colors
var outline_color : Color = Color("#1e1e1e") setget set_outline_color
var box_color : Color = Color("#1e1e1e") setget set_box_color
var grid_lines_width : int = 1 setget set_grid_lines_width
var v_lines_color : Color = Color("#cacaca") setget set_v_lines_color
var h_lines_color : Color = Color("#cacaca") setget set_h_lines_color
var grid_color : Color = Color("#1e1e1e") setget set_grid_color
@ -131,7 +132,9 @@ var treshold : Vector2 setget set_treshold
# only used to draw treshold values
var treshold_draw : Vector2
var tic_length : int = 5 setget set_tic_length
# Custom parameters for plot display
var tic_length : int = 5 setget set_tic_length # Length of the bar indicating a tic
var label_displacement : int = 4 setget set_label_displacement # Separation between the label and both the axis and the edge border
# !! API v2
static func instance(chart_type : int):
@ -182,6 +185,8 @@ func _get(property):
return grid_color
"Chart_Style/box_color":
return box_color
"Chart_Style/grid_lines_width":
return grid_lines_width
"Chart_Style/v_lines_color":
return v_lines_color
"Chart_Style/h_lines_color":
@ -264,6 +269,9 @@ func _set(property, value):
"Chart_Style/box_color":
box_color = value
return true
"Chart_Style/grid_lines_width":
grid_lines_width = value
return true
"Chart_Style/v_lines_color":
v_lines_color = value
return true
@ -635,10 +643,18 @@ func set_box_color(c : Color):
func set_tic_length(i: int):
tic_length = i
# ! API
func set_label_displacement(i:int):
label_displacement = i
# ! API
func set_grid_color(c : Color):
grid_color = c
# ! API
func set_grid_lines_width(i : int):
grid_lines_width = i
# ! API
func set_v_lines_color(c : Color):
v_lines_color = c

View File

@ -145,6 +145,14 @@ func build_property_list():
"type": TYPE_COLOR
})
property_list.append(
{
"hint": PROPERTY_HINT_RANGE,
"hint_string": "1, 100, 1",
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
"name": "Chart_Style/grid_lines_width",
"type": TYPE_INT
})
property_list.append(
{
"hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
@ -501,6 +509,7 @@ func calculate_tics():
x_labels[i] = String(x_labels[i])
x_chors = x_labels
else:
#TODO: h_dist = ?
for function in y_labels.size():
for value in x_datas[function]:
if not x_chors.has(value as String): #Don't append repeated values
@ -514,8 +523,8 @@ func build_chart():
if length > longest_y_tic:
longest_y_tic = length
OFFSET.x = longest_y_tic + tic_length
OFFSET.y = font_size * 2 #TODO: Change when get_string_size.y is correctly understood
OFFSET.x = longest_y_tic + tic_length + 2 * label_displacement
OFFSET.y = font.get_height() + tic_length + label_displacement
SIZE = get_size() - Vector2(OFFSET.x, 0)
origin = Vector2(OFFSET.x, SIZE.y - OFFSET.y)
@ -554,30 +563,23 @@ func draw_grid():
var point : Vector2 = origin + Vector2(p * x_pass, 0)
var size_text : Vector2 = font.get_string_size(x_chors[p])
# v grid
draw_line(point, point - Vector2(0, SIZE.y - OFFSET.y), v_lines_color, 0.2, true)
draw_line(point, point - Vector2(0, SIZE.y - OFFSET.y), v_lines_color, grid_lines_width, true)
# ascisse
draw_line(point + Vector2(0, tic_length), point, v_lines_color, 1, true)
draw_line(point + Vector2(0, tic_length), point, v_lines_color, grid_lines_width, true)
draw_string(font, point + Vector2(-size_text.x / 2, size_text.y + tic_length),
x_chors[p], font_color)
# ordinate
for p in y_chors.size():
var point : Vector2 = origin - Vector2(0, p * y_pass)
var size_text : Vector2 = font.get_string_size(y_chors[p]) #TODO: Investigate into size_text.y being the same for all chars
# Apparently numbers are drawn on the upper side of the space, but the size
# return all ascent + descent, meaning that it doesn't get correctly centered
# vertically. Is this behaviour common to all fonts (i think it can't be
# asumed)? Can be taken into account from godot?
#TEMPORARY FIX: Substract the descent that is not used to represent numbers (at least in the default font)
size_text.y -= font.get_descent()
var size_text := Vector2(font.get_string_size(y_chors[p]).x, font.get_ascent()) #The y should be ascent instead full height to get correctly centered
# h grid
draw_line(point, point + Vector2(SIZE.x - OFFSET.x, 0), h_lines_color, 0.2, true)
draw_line(point, point + Vector2(SIZE.x - OFFSET.x, 0), h_lines_color, grid_lines_width, true)
# ordinate
draw_line(point, point + Vector2(-tic_length, 0), h_lines_color, 1, true)
draw_string(font, point + Vector2(-size_text.x - tic_length, size_text.y / 2),
y_chors[p], font_color)
draw_line(point, point + Vector2(-tic_length, 0), h_lines_color, grid_lines_width, true)
draw_string(font, point + Vector2(-size_text.x - tic_length - label_displacement,
size_text.y / 2), y_chors[p], font_color)
func draw_chart_outlines():
@ -588,10 +590,6 @@ func draw_chart_outlines():
func draw_points():
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)