summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--histogram.cpp54
1 files changed, 36 insertions, 18 deletions
diff --git a/histogram.cpp b/histogram.cpp
index c7bbc6a..25b40d3 100644
--- a/histogram.cpp
+++ b/histogram.cpp
@@ -10,7 +10,7 @@
static const char *argv0;
void usage() {
- std::cerr << "Usage: " << argv0 << " [-h] [<lowbound> <highbound>] [<nbins>]" << std::endl
+ std::cerr << "Usage: " << argv0 << " [-h] [-v] [<lowbound> <highbound>] [<nbins>]" << std::endl
<< "Prints a simple histogram of stdin data in your terminal, using" << std::endl
<< "either the given lower and upper bounds, or the minimum and" << std::endl
<< "maximum extracted from the data." << std::endl
@@ -18,6 +18,9 @@ void usage() {
<< "to 10.)" << std::endl
<< "Data on stdin is assumed to be a list of floating-point values." << std::endl
<< std::endl
+ << " -v When passed, prints a histogram with vertical bars. This" << std::endl
+ << " usually fits more bars on a terminal, but is less informative" << std::endl
+ << " since this view omits exact frequency numbers." << std::endl
<< " -h Show this help." << std::endl;
}
@@ -47,14 +50,18 @@ int main(int argc, char **argv) {
argv0 = argv[0];
const int64_t BARWIDTH = 80;
+ const int64_t BARHEIGHT = 24;
+ bool vertical = false;
double low = 0, high = 1; // will be overwritten either from arguments or from data
bool havebounds;
int64_t nbins = 10;
std::vector<char*> plainargs;
for (int i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-h") == 0) {
+ if (strcmp(argv[i], "-v") == 0) {
+ vertical = true;
+ } else if (strcmp(argv[i], "-h") == 0) {
usage();
return 0;
} else {
@@ -163,21 +170,32 @@ int main(int argc, char **argv) {
}
// Print histogram
- char fullbar[BARWIDTH + 1];
- memset(fullbar, '#', BARWIDTH);
- fullbar[BARWIDTH] = '\0';
- char emptybar[BARWIDTH + 1];
- memset(emptybar, ' ', BARWIDTH);
- emptybar[BARWIDTH] = '\0';
-
- for (size_t i = 0; i < histogram.size(); i++) {
- int64_t tally = histogram[i];
- double binlow = low + (double)i / nbins * (high - low);
- double binhigh = low + (double)(i + 1) / nbins * (high - low);
- int64_t width = BARWIDTH * tally / maxtally;
- char terminator = ")]"[i == histogram.size() - 1];
- std::cout << fullbar + BARWIDTH - width << emptybar + width
- << " [" << std::setw(11) << binlow << " - " << std::setw(11) << binhigh << terminator
- << " [" << tally << "]" << std::endl;
+ if (vertical) {
+ for (int y = BARHEIGHT; y >= 1; y--) {
+ for (size_t i = 0; i < histogram.size(); i++) {
+ std::cout << " #"[BARHEIGHT * histogram[i] / maxtally >= y];
+ }
+ std::cout << std::endl;
+ }
+ std::cout << std::left << std::setw(nbins / 2) << low << ' '
+ << std::right << std::setw(nbins - nbins / 2 - 1) << high << std::endl;
+ } else {
+ char fullbar[BARWIDTH + 1];
+ memset(fullbar, '#', BARWIDTH);
+ fullbar[BARWIDTH] = '\0';
+ char emptybar[BARWIDTH + 1];
+ memset(emptybar, ' ', BARWIDTH);
+ emptybar[BARWIDTH] = '\0';
+
+ for (size_t i = 0; i < histogram.size(); i++) {
+ int64_t tally = histogram[i];
+ double binlow = low + (double)i / nbins * (high - low);
+ double binhigh = low + (double)(i + 1) / nbins * (high - low);
+ int64_t width = BARWIDTH * tally / maxtally;
+ char terminator = ")]"[i == histogram.size() - 1];
+ std::cout << fullbar + BARWIDTH - width << emptybar + width
+ << " [" << std::setw(11) << binlow << " - " << std::setw(11) << binhigh << terminator
+ << " [" << tally << "]" << std::endl;
+ }
}
}