Commit b5b9dddd authored by Paul Asmuth's avatar Paul Asmuth
Browse files

implement group-by in plot-lines

parent a932262f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -48,6 +48,12 @@ public:
          colors_(colors),
          color_index_(0) {}

  Color get(size_t seq) const {
    Color c;
    c.parse(colors_[seq % colors_.size()]);
    return c;
  }

  Color next() {
    Color c;
    c.parse(colors_[color_index_++ % colors_.size()]);
+12 −7
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include "data_frame.h"
#include <iostream>

namespace plotfx {

@@ -71,17 +72,21 @@ Value value_from_float(double v) {
  return std::to_string(v);
}

std::vector<std::pair<size_t, size_t>> column_group(const DataColumn& col) {
  std::vector<std::pair<size_t, size_t>> groups;
std::vector<DataGroup> column_group(const DataColumn& col) {
  std::vector<DataGroup> groups;

  for (size_t idx = 0; idx < col.data.size(); ) {
    auto begin = idx;
    auto end = idx;
    while (end < col.data.size() && col.data[end] == col.data[begin]) {
      end = idx++;
    DataGroup g;
    g.key = col.data[idx];
    g.key = col.data[idx];
    g.begin = idx;
    g.end = idx;

    while (g.end < col.data.size() && col.data[g.end] == col.data[g.begin]) {
      g.end = idx++;
    }

    groups.emplace_back(begin, end);
    groups.emplace_back(g);
  }

  return groups;
+7 −1
Original line number Diff line number Diff line
@@ -52,7 +52,13 @@ ReturnCode column_find(
    const std::string& column_name,
    const DataColumn** column);

std::vector<std::pair<size_t, size_t>> column_group(const DataColumn& col);
struct DataGroup {
  Value key;
  size_t begin;
  size_t end;
};

std::vector<DataGroup> column_group(const DataColumn& col);

size_t series_len(const Series& s);

+30 −13
Original line number Diff line number Diff line
@@ -55,18 +55,13 @@ void domain_fit_continuous(const Series& data_raw, DomainConfig* domain) {
}

void domain_fit_categorical(const Series& data, DomainConfig* domain) {
  std::set<std::string> cache;
  for (const auto& d : domain->categories) {
    cache.insert(d);
  }

  for (const auto& d : data) {
    if (cache.count(d) > 0) {
    if (domain->map.count(d) > 0) {
      continue;
    }

    domain->map.emplace(d, domain->categories.size());
    domain->categories.emplace_back(d);
    cache.insert(d);
  }
}

@@ -152,16 +147,16 @@ std::vector<double> domain_translate_log(
std::vector<double> domain_translate_categorical(
    const DomainConfig& domain,
    const Series& series) {
  std::unordered_map<std::string, double> cache;
  for (size_t i = 0; i < domain.categories.size(); ++i) {
    cache.emplace(domain.categories[i], double(i));
  }

  double category_count = domain.categories.size();

  std::vector<double> mapped;
  for (const auto& v : series) {
    auto vt = (cache[v] / category_count) + (0.5 / category_count);
    size_t vi = 0;
    if (auto vm = domain.map.find(v); vm != domain.map.end()) {
      vi = vm->second;
    }

    auto vt = (vi / category_count) + (0.5 / category_count);

    if (domain.inverted) {
      vt = 1.0 - vt;
@@ -259,6 +254,28 @@ Series domain_untranslate(
  return {};
}

Color domain_get_color_categorical(
    const DomainConfig& domain,
    const Value& value) {
  size_t seq = 0;
  if (auto iter = domain.map.find(value); iter != domain.map.end()) {
    seq = iter->second;
  }

  return domain.colors.get(seq);
}

Color domain_get_color(
    const DomainConfig& domain,
    const Value& value) {
  switch (domain.kind) {
    case DomainKind::CATEGORICAL:
      return domain_get_color_categorical(domain, value);
    default:
      return Color::fromRGB(0,0,0);
  }
}

ReturnCode domain_configure(
    const plist::Property& prop,
    DomainConfig* domain) {
+7 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#include <unordered_map>
#include "utils/return_code.h"
#include "plist/plist.h"
#include "common/color_scheme.h"
#include "common/data_frame.h"

namespace plotfx {
@@ -56,6 +57,8 @@ struct DomainConfig {
  std::optional<double> max_auto;
  std::optional<double> log_base;
  std::vector<std::string> categories;
  std::unordered_map<std::string, double> map;
  ColorScheme colors;
  double padding;
};

@@ -69,6 +72,10 @@ Series domain_untranslate(
    const DomainConfig& domain,
    const std::vector<double>& data);

Color domain_get_color(
    const DomainConfig& domain,
    const Value& value);

ReturnCode domain_configure(
    const plist::Property& prop,
    DomainConfig* domain);
Loading