Class: Writexlsx::Chart::Scatter

Inherits:
Writexlsx::Chart show all
Includes:
Utility, WriteDPtPoint
Defined in:
lib/write_xlsx/chart/scatter.rb

Constant Summary

Constants included from Utility

Utility::CHAR_WIDTHS, Utility::COL_MAX, Utility::PERL_TRUE_VALUES, Utility::ROW_MAX, Utility::SHEETNAME_MAX, Utility::STR_MAX

Instance Attribute Summary

Attributes inherited from Writexlsx::Chart

#already_inserted, #axis2_ids, #combined, #date_category, #embedded, #formula_data, #formula_ids, #height, #id, #index, #label_position_default, #label_positions, #name, #palette, #protection, #series_index, #width, #writer, #x2_axis, #x_offset, #x_scale, #y2_axis, #y_offset, #y_scale

Instance Method Summary collapse

Methods included from WriteDPtPoint

#write_d_pt_point

Methods included from Utility

#absolute_char, #check_dimensions, #check_dimensions_and_update_max_min_values, #check_parameter, #color, #convert_date_time, #convert_font_args, #dash_types, delete_files, #escape_url, #fill_properties, #float_to_str, #get_font_latin_attributes, #get_font_style_attributes, #get_image_properties, #layout_properties, #legend_properties, #line_fill_properties, #line_properties, #palette_color, #params_to_font, #pattern_properties, #pixels_to_points, #process_bmp, #process_gif, #process_jpg, #process_png, #process_workbook_options, #ptrue?, #put_deprecate_message, #quote_sheetname, #r_id_attributes, #row_col_notation, #shape_style_base, #store_col_max_min_values, #store_row_max_min_values, #substitute_cellref, #underline_attributes, #v_shape_attributes_base, #v_shape_style_base, #value_or_raise, #write_a_body_pr, #write_a_def_rpr, #write_a_end_para_rpr, #write_a_lst_style, #write_a_p_formula, #write_a_p_pr_formula, #write_a_solid_fill, #write_a_srgb_clr, #write_anchor, #write_auto_fill, #write_color, #write_comment_path, #write_def_rpr_r_pr_common, #write_div, #write_fill, #write_font, #write_stroke, #write_tx_pr, #write_xml_declaration, #xl_cell_to_rowcol, #xl_col_to_name, #xl_range, #xl_range_formula, #xl_rowcol_to_cell, #xl_string_pixel_width, #xml_str

Methods inherited from Writexlsx::Chart

#add_series, #already_inserted?, #assemble_xml_file, #data_id, factory, #is_secondary?, #process_names, #set_chartarea, #set_drop_lines, #set_embedded_config_data, #set_high_low_lines, #set_legend, #set_plotarea, #set_size, #set_style, #set_table, #set_title, #set_up_down_bars, #set_x2_axis, #set_x_axis, #set_xml_writer, #set_y2_axis, #set_y_axis, #show_blanks_as, #show_hidden_data, #show_na_as_empty_cell, #write_bar_chart, #write_val_axis

Methods included from Gradient

#gradient_properties

Constructor Details

#initialize(subtype) ⇒ Scatter

Returns a new instance of Scatter.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/write_xlsx/chart/scatter.rb', line 26

def initialize(subtype)
  super(subtype)
  @subtype           = subtype || 'marker_only'
  @cross_between     = 'midCat'
  @horiz_val_axis    = 0
  @val_axis_position = 'b'
  @smooth_allowed    = 1

  # Set the available data label positions for this chart type.
  @label_position_default = 'right'
  @label_positions = {
    'center' => 'ctr',
    'right'  => 'r',
    'left'   => 'l',
    'above'  => 't',
    'below'  => 'b',
    # For backward compatibility.
    'top'    => 't',
    'bottom' => 'b'
  }
end

Instance Method Details

#combine(_chart) ⇒ Object

Override parent method to add a warning.



51
52
53
# File 'lib/write_xlsx/chart/scatter.rb', line 51

def combine(_chart)
  raise 'Combined chart not currently supported with scatter chart as the primary chart'
end

#modify_series_formattingObject

Add default formatting to the series data unless it has already been specified by the user.



199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/write_xlsx/chart/scatter.rb', line 199

def modify_series_formatting
  # The default scatter style "markers only" requires a line type
  if @subtype == 'marker_only'
    # Go through each series and define default values.
    @series.each do |series|
      # Set a line type unless there is already a user defined type.
      series.line = line_properties(width: 2.25, none: 1, _defined: 1) unless series.line_defined?
    end
  end

  # Turn markers off for subtypes that don't have them
  unless @subtype =~ /marker/
    # Go through each series and define default values.
    @series.each do |series|
      # Set a marker type unless there is already a user defined type.
      series.marker = Marker.new(type: 'none', _defined: 1) unless ptrue?(series.marker)
    end
  end
end

#write_cat_val_axis(x_axis, y_axis, axis_ids, position) ⇒ Object

Write the <c:valAx> element. This is for the second valAx in scatter plots.

Usually the X axis.



225
226
227
228
229
230
231
232
233
234
# File 'lib/write_xlsx/chart/scatter.rb', line 225

def write_cat_val_axis(x_axis, y_axis, axis_ids, position) # :nodoc:
  return unless axis_ids && !axis_ids.empty?

  write_val_axis_base(
    y_axis, x_axis,
    axis_ids[1],
    axis_ids[0],
    x_axis.position || position || @val_axis_position
  )
end

#write_chart_type(params) ⇒ Object

Override the virtual superclass method with a chart specific method.



58
59
60
61
# File 'lib/write_xlsx/chart/scatter.rb', line 58

def write_chart_type(params)
  # Write the c:areaChart element.
  write_scatter_chart(params)
end

#write_plot_areaObject

Over-ridden to have 2 valAx elements for scatter charts instead of catAx/valAx.

Write the <c:plotArea> element.



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/write_xlsx/chart/scatter.rb', line 121

def write_plot_area
  @writer.tag_elements('c:plotArea') do
    # Write the c:layout element.
    write_layout(@plotarea.layout, 'plot')

    # Write the subclass chart type elements for primary and secondary axes.
    write_chart_type(primary_axes: 1)
    write_chart_type(primary_axes: 0)

    # Write c:catAx and c:valAx elements for series using primary axes.
    write_cat_val_axis(@x_axis, @y_axis, @axis_ids, 'b')

    tmp = @horiz_val_axis
    @horiz_val_axis = 1
    write_val_axis(@x_axis, @y_axis, @axis_ids, 'l')
    @horiz_val_axis = tmp

    # Write c:valAx and c:catAx elements for series using secondary axes.
    write_cat_val_axis(@x2_axis, @y2_axis, @axis2_ids, 'b')

    @horiz_val_axis = 1
    write_val_axis(@x2_axis, @y2_axis, @axis2_ids, 'l')

    # Write the c:spPr element for the plotarea formatting.
    write_sp_pr(@plotarea)
  end
end

#write_scatter_chart(params) ⇒ Object

Write the <c:scatterChart> element.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/write_xlsx/chart/scatter.rb', line 66

def write_scatter_chart(params)
  series = if params[:primary_axes] == 1
             get_primary_axes_series
           else
             get_secondary_axes_series
           end
  return if series.empty?

  style = 'lineMarker'
  # Set the user defined chart subtype
  style = 'smoothMarker' if %w[smooth_with_markers smooth].include?(@subtype)

  # Add default formatting to the series data.
  modify_series_formatting

  @writer.tag_elements('c:scatterChart') do
    # Write the c:scatterStyle element.
    write_scatter_style(style)
    # Write the series elements.
    series.each { |s| write_series(s) }
    # Write the c:marker element.
    write_marker_value
    # Write the c:axId elements
    write_axis_ids(params)
  end
end

#write_scatter_style(val) ⇒ Object

Write the <c:scatterStyle> element.



191
192
193
# File 'lib/write_xlsx/chart/scatter.rb', line 191

def write_scatter_style(val)
  @writer.empty_tag('c:scatterStyle', [['val', val]])
end

#write_ser(series) ⇒ Object

Over-ridden to write c:xVal/c:yVal instead of c:cat/c:val elements.

Write the <c:ser> element.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/write_xlsx/chart/scatter.rb', line 98

def write_ser(series)
  @writer.tag_elements('c:ser') do
    write_ser_base(series)
    # Write the c:xVal element.
    write_x_val(series)
    # Write the c:yVal element.
    write_y_val(series)
    # Write the c:smooth element.
    if @subtype =~ /smooth/ && !series.smooth
      write_c_smooth(1)
    else
      write_c_smooth(series.smooth)
    end
  end
  @series_index += 1
end

#write_x_val(series) ⇒ Object

Write the <c:xVal> element.



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/write_xlsx/chart/scatter.rb', line 152

def write_x_val(series)
  formula = series.categories
  data_id = series.cat_data_id
  data    = @formula_data[data_id]

  @writer.tag_elements('c:xVal') do
    # Check the type of cached data.
    type = get_data_type(data)

    # TODO. Can a scatter plot have non-numeric data.

    if type == 'str'
      # Write the c:numRef element.
      write_str_ref(formula, data, type)
    else
      write_num_ref(formula, data, type)
    end
  end
end

#write_y_val(series) ⇒ Object

Write the <c:yVal> element.



175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/write_xlsx/chart/scatter.rb', line 175

def write_y_val(series)
  formula = series.values
  data_id = series.val_data_id
  data    = @formula_data[data_id]

  @writer.tag_elements('c:yVal') do
    # Unlike Cat axes data should only be numeric

    # Write the c:numRef element.
    write_num_ref(formula, data, 'num')
  end
end