diff --git a/histogram.cpp b/histogram.cpp index b3defde..5867795 100644 --- a/histogram.cpp +++ b/histogram.cpp @@ -35,3 +35,16 @@ make_histogram(const std::vector& numbers, size_t bin_count){ } return bins; } + + +std::vector +make_borders(const std::vector& numbers, size_t bin_count){ + double min, max; + find_minmax(numbers, min, max); + double diff = (max - min) / bin_count; + std::vector borders(bin_count - 1); + for (size_t i = 0; i <= bin_count - 2; i++){ + borders[i] = min + (i + 1) * diff; + } + return borders; +} diff --git a/svg.cpp b/svg.cpp new file mode 100644 index 0000000..64e6409 --- /dev/null +++ b/svg.cpp @@ -0,0 +1,65 @@ +#include "svg.h" +using namespace std; + +void +svg_begin(double width, double height){ + cout << "\n"; + cout << "\n"; +} + +void +svg_end(){ + cout << "\n"; + +} +void +svg_text(double left, double baseline, string text){ + cout << "" << text << ""; +} + +void svg_rect(double x, double y, double width, double height, string stroke = "black" , string fill = "balck"){ + cout << ""; + +} + +void +show_histogram_svg(const vector& bins, const std::vector& borders, size_t bin_count) { + const auto IMAGE_WIDTH = 400; + const auto IMAGE_HEIGHT = 300; + const auto TEXT_LEFT = 20; + const auto TEXT_BASELINE = 20; + const auto TEXT_WIDTH = 50; + const auto BIN_HEIGHT = 30; + const auto BLOCK_WIDTH = 10; + svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT); + vector colors = {"crimson", "darkorange", "gold", "lime", "aqua", "dodgerblue", "mediumpurple"}; + size_t max_bin = *max_element(bins.begin(), bins.end()); + size_t number_of_blocks; + double top = 0; + size_t color = 0; + size_t border = 0; + for (size_t bin: bins){ + number_of_blocks = bin; + if ((max_bin * BLOCK_WIDTH) > (IMAGE_WIDTH - TEXT_WIDTH)){ + number_of_blocks = ((IMAGE_WIDTH - TEXT_WIDTH)/10) * (static_cast(bin) / max_bin); + } + const double bin_width = BLOCK_WIDTH * number_of_blocks; + svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "black", colors[color]); + if (border < bin_count - 1){ + top += BIN_HEIGHT; + svg_text(TEXT_LEFT / 2, top + TEXT_BASELINE , to_string(borders[border])); + border += 1; + top += BIN_HEIGHT; + } + color += 1; + if (color > 6){ + color = 0; + } + } + svg_end(); +}