Commit 7b5daec7 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

improved scale padding, remove obsolete code

parent df2ce4cb
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
width: 1200px;
height: 480px;

scale-x-padding: 0.6;

lines {
  xs: csv('tests/testdata/city_temperatures_pivot.csv', month);
  ys: csv('tests/testdata/city_temperatures_pivot.csv', temp_london);
@@ -32,11 +34,11 @@ axis {
}

axis {
  position: bottom;
  layout: linear(1, align 1);
  position: top;
  layout: discrete;
}

axis {
  position: top;
  layout: discrete;
  position: bottom;
  layout: linear(1, align 1);
}
+9 −73
Original line number Diff line number Diff line
@@ -38,24 +38,11 @@ static const double kDefaultLogBase = 10;

DomainConfig::DomainConfig() :
    kind(DomainKind::LINEAR),
    min_auto_snap_zero(false),
    inverted(false),
    padding(0.01f),
    padding(0),
    limit_hints(std::make_shared<DomainLimitHints>()) {}

void domain_fit_kind(const Series& data, DomainConfig* domain) {
  if (series_is_numeric(data)) {
    domain->kind = DomainKind::LINEAR;
  } else {
    domain->kind = DomainKind::DISCRETE;
  }
}

void domain_fit(double value, DomainConfig* domain) {
  //if (domain->kind == DomainKind::AUTO) {
  //  domain_fit_kind(data, domain);
  //}

  if (!domain->limit_hints->min_value || *domain->limit_hints->min_value > value) {
    domain->limit_hints->min_value = std::optional<double>(value);
  }
@@ -64,31 +51,21 @@ void domain_fit(double value, DomainConfig* domain) {
  }
}

size_t domain_cardinality(const DomainConfig& domain) {
  switch (domain.kind) {
    case DomainKind::DISCRETE:
      return domain.categories.size();
    default:
      return std::ceil(domain_max(domain) - domain_min(domain));
  }
}

double domain_min(const DomainConfig& domain) {
  auto min = domain.min.value_or(domain.limit_hints->min_value.value_or(0));
  auto max = domain.max.value_or(domain.limit_hints->max_value.value_or(0));

  double min_auto = 0;
  if (!domain.min_auto_snap_zero || min < 0) {
    min_auto = min - (max - min) * domain.padding;
  auto min_auto = 1.0f;
  if (domain.limit_hints->min_value) {
    min_auto = *domain.limit_hints->min_value - domain.padding;
  }

  return domain.min.value_or(min_auto);
}

double domain_max(const DomainConfig& domain) {
  auto min = domain.min.value_or(domain.limit_hints->min_value.value_or(0));
  auto max = domain.max.value_or(domain.limit_hints->max_value.value_or(0));
  double max_auto = max + (max - min) * domain.padding;
  auto max_auto = 1.0f;
  if (domain.limit_hints->max_value) {
    max_auto = *domain.limit_hints->max_value + domain.padding;
  }

  return domain.max.value_or(max_auto);
}

@@ -131,21 +108,6 @@ double domain_translate_log(
  return vt;
}

double domain_translate_discrete(
    const DomainConfig& domain,
    double v) {
  double min = domain_min(domain);
  double max = domain_max(domain) + 1;

  auto vt = (v - min) / (max - min);

  if (domain.inverted) {
    vt = 1.0 - vt;
  }

  return vt;
}

double domain_translate(
    const DomainConfig& domain,
    double value) {
@@ -154,8 +116,6 @@ double domain_translate(
      return domain_translate_linear(domain, value);
    case DomainKind::LOGARITHMIC:
      return domain_translate_log(domain, value);
    case DomainKind::DISCRETE:
      return domain_translate_discrete(domain, value);
    default:
      return std::numeric_limits<double>::quiet_NaN();
  }
@@ -192,22 +152,6 @@ Value domain_untranslate_log(const DomainConfig& domain, double vt) {
  return value_from_float(min + pow(log_base, vt * range_log));
}

Value domain_untranslate_discrete(
    const DomainConfig& domain,
    double vt) {
  auto min = domain_min(domain);
  auto max = domain_max(domain) + 1;
  auto range = max - min;

  vt -= 0.5 / range;

  if (domain.inverted) {
    vt = 1.0 - vt;
  }

  return value_from_float(min + (max - min) * vt);
}

Value domain_untranslate(
    const DomainConfig& domain,
    double value) {
@@ -216,8 +160,6 @@ Value domain_untranslate(
      return domain_untranslate_linear(domain, value);
    case DomainKind::LOGARITHMIC:
      return domain_untranslate_log(domain, value);
    case DomainKind::DISCRETE:
      return domain_untranslate_discrete(domain, value);
  }

  return {};
@@ -250,11 +192,6 @@ ReturnCode domain_configure(
      continue;
    }

    if (prop == "discrete") {
      domain->kind = DomainKind::DISCRETE;
      continue;
    }

    if (prop == "invert" ||
        prop == "inverted") {
      domain->inverted = true;
@@ -265,7 +202,6 @@ ReturnCode domain_configure(
      "linear",
      "log",
      "logarithmic",
      "discrete",
      "inverted",
      "inverted"
    });
+2 −7
Original line number Diff line number Diff line
@@ -43,8 +43,7 @@
namespace plotfx {

enum class DomainKind {
  AUTO, LINEAR, LOGARITHMIC, DISCRETE

  LINEAR, LOGARITHMIC
};

struct DomainLimitHints {
@@ -55,13 +54,10 @@ struct DomainLimitHints {
struct DomainConfig {
  DomainConfig();
  DomainKind kind;
  bool inverted;
  std::optional<double> min;
  bool min_auto_snap_zero;
  std::optional<double> max;
  std::optional<double> log_base;
  std::vector<std::string> categories;
  std::unordered_map<std::string, double> map;
  bool inverted;
  double padding;
  std::shared_ptr<DomainLimitHints> limit_hints;
};
@@ -73,7 +69,6 @@ static const std::string SCALE_DEFAULT_Y = "y";

void domain_fit(double value, DomainConfig* domain);

size_t domain_cardinality(const DomainConfig& domain);
double domain_min(const DomainConfig& domain);
double domain_max(const DomainConfig& domain);

+2 −5
Original line number Diff line number Diff line
@@ -484,11 +484,8 @@ ReturnCode axis_place_labels_discrete(
ReturnCode axis_place_labels_default(
    const DomainConfig& domain,
    AxisDefinition* axis) {
  if (domain.kind == DomainKind::DISCRETE) {
    return axis_place_labels_discrete(domain, axis);
  }

  return axis_place_labels_subdivide(domain, axis, 8); // TODO: automatically choose a good value
  // TODO: improved default label placement
  return axis_place_labels_subdivide(domain, axis, 8);
}