Commit 9a7ecbb7 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add groups_to_colors

parent b218ac72
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -75,5 +75,26 @@ std::vector<Color> series_to_colors(
  return colors;
}

std::vector<Color> groups_to_colors(
    const std::vector<DataGroup>& groups,
    const ColorScheme& palette) {
  auto max_idx =
      std::max_element(
          groups.begin(),
          groups.end(),
          [] (const DataGroup& a, const DataGroup& b) { return a.end < b.end; })
      ->end;

  std::vector<Color> colors(max_idx);
  for (size_t i = 0; i < groups.size(); ++i) {
    std::fill(
        colors.begin() + groups[i].begin,
        colors.begin() + groups[i].end,
        palette.get(i));
  }

  return colors;
}

} // namespace plotfx
+5 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include <string>
#include <unordered_map>
#include "common/domain.h"
#include "common/data_frame.h"

namespace plotfx {

@@ -57,5 +58,9 @@ std::vector<Color> series_to_colors(
    const DomainConfig& domain_config,
    const ColorScheme& palette);

std::vector<Color> groups_to_colors(
    const std::vector<DataGroup>& groups,
    const ColorScheme& palette);

} // namespace plotfx
+9 −8
Original line number Diff line number Diff line
@@ -130,14 +130,6 @@ ReturnCode configure(
    return ReturnCode::errorf("EARG", "scale not found: $0", scale_y);
  }

  /* load data */
  config->x = domain_translate(*domain_x, *data_x);
  config->y = domain_translate(*domain_y, *data_y);
  config->line_width = measure_or(line_width, from_pt(kDefaultLineWidthPT, doc.dpi));
  config->colors = fallback(
      series_to_colors(color_var, color_domain, color_palette),
      color_default);

  /* group data */
  if (data_group) {
    if (data_x->size() != data_group->size()) {
@@ -152,6 +144,15 @@ ReturnCode configure(
    config->groups.emplace_back(g);
  }

  /* return element */
  config->x = domain_translate(*domain_x, *data_x);
  config->y = domain_translate(*domain_y, *data_y);
  config->line_width = measure_or(line_width, from_pt(kDefaultLineWidthPT, doc.dpi));
  config->colors = fallback(
      series_to_colors(color_var, color_domain, color_palette),
      color_default,
      groups_to_colors(config->groups, color_palette));

  return OK;
}

+19 −1
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ ReturnCode configure(
    PlotPointsConfig* config) {
  SeriesRef data_x = series_find(data.defaults, "x");
  SeriesRef data_y = series_find(data.defaults, "y");
  SeriesRef data_group = series_find(data.defaults, "group");

  std::string scale_x = SCALE_DEFAULT_X;
  std::string scale_y = SCALE_DEFAULT_Y;
@@ -93,6 +94,7 @@ ReturnCode configure(
    {"x-scale", bind(&configure_string, _1, &scale_x)},
    {"y", configure_series_fn(&data_y)},
    {"y-scale", bind(&configure_string, _1, &scale_y)},
    {"group", configure_series_fn(&data_group)},
    {"color", configure_var(&color_var, configure_color_opt(&color_default))},
    {"size", bind(&configure_measure_rel, _1, doc.dpi, doc.font_size, &point_size)},
  };
@@ -123,13 +125,29 @@ ReturnCode configure(
    return ReturnCode::errorf("EARG", "scale not found: $0", scale_y);
  }

  /* group data */
  std::vector<DataGroup> groups;
  if (data_group) {
    if (data_x->size() != data_group->size()) {
      return ERROR_INVALID_ARGUMENT;
    }

    groups = plotfx::series_group(*data_group);
  } else {
    DataGroup g;
    g.begin = 0;
    g.end = data_x->size();
    groups.emplace_back(g);
  }

  /* return element */
  config->x = domain_translate(*domain_x, *data_x);
  config->y = domain_translate(*domain_y, *data_y);
  config->point_size = measure_or(point_size, from_pt(kDefaultPointSizePT, doc.dpi));
  config->colors = fallback(
      series_to_colors(color_var, color_domain, color_palette),
      color_default);
      color_default,
      groups_to_colors(groups, color_palette));

  return OK;
}
+1 −3
Original line number Diff line number Diff line
plot {
  group: csv('tests/testdata/city_temperatures.csv', 0);
  x: csv('tests/testdata/city_temperatures.csv', 1);
  y: csv('tests/testdata/city_temperatures.csv', 2);
  group: csv('tests/testdata/city_temperatures.csv', 0);

  axis-x-format: string;
  axis-y-min: -10;
@@ -16,12 +16,10 @@ plot {

  layer {
    type: lines;
    color: csv('tests/testdata/city_temperatures.csv', 0);
  }

  layer {
    type: points;
    color: csv('tests/testdata/city_temperatures.csv', 0);
    point-size: 3.3pt;
  }
}