diff --git a/barchart/barchart.sty b/barchart/barchart.sty new file mode 100644 index 0000000..8c7058a --- /dev/null +++ b/barchart/barchart.sty @@ -0,0 +1,171 @@ +% this is my first package +% +% (c) Frederik Vanggaard +% +% Inspired by bchart version 0.1.2 by Tobias Kuhn +% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +% +\NeedsTeXFormat{LaTeX2e}[1994/06/01] +\ProvidesPackage{barchart} + [2014/05/19 v0.01 LaTeX package for bar charts] + +\usepackage{tikz} +\usepackage{ifthen} +\usetikzlibrary{calc} + +\newlength{\barcpos} +\newcommand{\tempWidth}{} +% barchart args: +% #1: max +% #2: min +% #3: steps +% #4: step +% #5: width +% #7: height +% #8: scale +% #9: axis label +\newcommand{\barcmin}{} +\newcommand{\barcmax}{} +\newcommand{\barcsteps}{} +\newcommand{\barcstep}{} +\newlength{\barctotalWidth} +\newcommand{\ypos}{} +\newcommand{\scale}{} +\newcommand{\barcy}{} + +\makeatletter +\define@key{barchart}{min}{\renewcommand{\barcmin}{#1}} +\define@key{barchart}{max}{\renewcommand{\barcmax}{#1}} +\define@key{barchart}{steps}{\renewcommand{\barcsteps}{#1}} +\define@key{barchart}{step}{\renewcommand{\barcstep}{#1}} +\define@key{barchart}{width}{\setlength{\barctotalWidth}{#1}} +\define@key{barchart}{height}{\renewcommand{\ypos}{#1}} +\define@key{barchart}{scale}{\renewcommand{\scale}{#1}} +\define@key{barchart}{label}{\renewcommand{\barcy}{#1}} + +\makeatother + +%barc args: +% #1: color +% #2: width +% #3: plain (true/false) +% #4: label +% #5: rotation (true/false) +\newcommand{\barccolor}{} +\newcommand{\barcwidth}{} +\newcommand{\barcplain}{} +\newcommand{\barclabel}{} +\newcommand{\barcrotation}{} + +\makeatletter +\define@key{barc}{color}{\renewcommand{\barccolor}{#1}} +\define@key{barc}{width}{\renewcommand{\barcwidth}{#1}} +\define@key{barc}{plain}[false]{\renewcommand{\barcplain}{true}} +\define@key{barc}{label}{\renewcommand{\barclabel}{#1}} +\define@key{barc}{rotation}[false]{\renewcommand{\barcrotation}{true}} + +\makeatother + +%skip args: +% #1: size +\newcommand{\barcskiplabel}{} + +\makeatletter +\define@key{barcskip}{label}{\renewcommand{\barcskiplabel}{#1}} +\makeatother + +\newenvironment{barchart}[1][]{% + \newcommand{\barc}[2][] {% + + \renewcommand{\barccolor}{blue!20} + \renewcommand{\barcwidth}{30pt} + \renewcommand{\barcplain}{false} + \renewcommand{\barclabel}{} + \renewcommand{\barcrotation}{false} + + \addtolength{\barcpos}{5mm} + \setkeys{barc}{##1} + %\fill[color=\barccolor,fill,draw](\barcpos,0) rectangle (\barcwidth+\barcpos,##2); + \fill[color=\barccolor, fill,draw](\barcpos,0) rectangle ($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$); + \draw (\barcpos,0) rectangle ($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$); + + %\node[draw, shape=circle,fill,\barccolor] at (\barcpos+\barcwidth-5mm,0){}; + %\node[draw, shape=circle,fill,\barccolor] at ($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$){##2}; + + \ifthenelse{\equal{\barcplain}{true}}{}{ + % Write value: + %\node[anchor=east] at ($(\barcpos+(\barcwidth/3,0) + (0,##2+0.5)$){##2}; + % $##2-\bcmin*(\bcwidth/\bcrange,0) + (0,\bcpos-2.5mm)$ + \node[] at ($($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$)!0.5!(\barcpos,##2+0.25+\barcmax/10) $){##2}; + } + \ifthenelse{\equal{\barcrotation}{true}}{false}{ + \node[label={[label distance=0.5cm,text depth=-1ex,rotate=-90]right:\barclabel}] at ($($\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$)!0.5!(\barcpos,1.5) $) {}; + } + \ifthenelse{\equal{\barcrotation}{false}}{true}{ + \node[label={[label distance=0.5cm,text depth=-1ex,rotate=-45]right:\barclabel}] at ($($\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-10mm,0)$)!0.5!(\barcpos,1) $) {}; + } + + \addtolength{\barcpos}{\dimexpr(\barcwidth-20pt) \relax} + + } + + \newcommand{\barcskip}[2][]{ + \renewcommand{\barcskiplabel}{} + \setkeys{barcskip}{##1} + \addtolength{\barcpos}{##2} + } + + \renewcommand{\barcmin}{0} + \renewcommand{\barcmax}{10} + \renewcommand{\barcstep}{1} + \renewcommand{\ypos}{1em} + \renewcommand{\scale}{1} + + \renewcommand{\smallskip}[1][]{\barcskip[##1]{2.5mm}} + \renewcommand{\medskip}[1][]{\barcskip[##1]{5.0mm}} + \renewcommand{\bigskip}[1][]{\barcskip[##1]{7.5mm}} + + \newcommand{\barcrange}{\bcstripunit{\dimexpr\barcmax pt-\barcmin pt\relax}} + \renewcommand{\barcstep}{\barcrange} + \renewcommand{\barcsteps}{0,\barcstep,...,\barcrange}% + + + \setkeys{barchart}{#1} + \begin{tikzpicture}[y=\ypos, scale = \scale] +} { + + + \draw (0,0) -- (\barcpos+\barcwidth,0); + \draw (0,0) -- ($(0,(\barcmax-\barcmin)$); + \draw (0,0) -- (0-1mm,0); + \node[anchor=east] (n) at (0-1mm,0) {\bcstripunit{\dimexpr\barcmin pt\relax}}; + \coordinate (labelpos) at (n.east); + + + \foreach \x in \barcsteps { + \ifthenelse{\equal{\x}{0}}{}{ + \draw ($\x*(0,\barcmax/\barcrange) + (0,0)$) -- ($\x*(0,\barcmax/\barcrange) + (0-1mm,0)$); + \node[anchor=east] at (-1mm,\x){\bcstripunit{\dimexpr\barcmin pt+\x pt\relax}}; + } + } + + + \ifthenelse{\equal{\barcy}{}}{}{ + %\node[label={[label distance=0.5cm,align=center,text depth=-1ex,rotate=-90]left:\barcy}] at ($(-0.75,\barcmax) !0.5! (0,\barcmin)$){}; + \node[rotate=-90] at ($(-0.75-\barcmax/100,\barcmax) !0.5! (0,\barcmin)$){\barcy}; + } + \end{tikzpicture}% + + +} + +\makeatletter +\newcommand*{\bcstripunit}[1]{\strip@pt#1} +\makeatother + + +%% +%% End of file `barchart.sty'. \ No newline at end of file diff --git a/barchart/barchart_doc.pdf b/barchart/barchart_doc.pdf new file mode 100644 index 0000000..6530f1e Binary files /dev/null and b/barchart/barchart_doc.pdf differ diff --git a/barchart/barchart_doc.tex b/barchart/barchart_doc.tex new file mode 100644 index 0000000..e2dc22a --- /dev/null +++ b/barchart/barchart_doc.tex @@ -0,0 +1,159 @@ +\documentclass[]{article} +\usepackage{barchart} + +\title{\texttt{barchart}: Easy Bar Chart in \LaTeX + \medskip\\ + \large Version 0.1.0 +} +\author{Frederik Vanggaard} +\date{\today} + +\begin{document} + +\maketitle + +\section{Introduction} +\texttt{barchart} is a \LaTeX\space package for creating simple and easy to use bar-chart. The package is heavily inspired by \texttt{bchart} by Tobias Kuhn. \texttt{barchart} provides an easy way to create vertical barcharts using Tikz. + +\section{Charts} +\texttt{barchart} comes with a variety of customization options for both the overall chart and for each individual bar. A simple chart can be done like this: + +\begin{quote}\small +\begin{verbatim} +\begin{barchart} + \barc{5} + \barc{7} + \barc{3} +\end{barchart} +\end{verbatim} +\end{quote} +\begin{quote}\small +\begin{figure}[ht] + \begin{barchart} + \barc{5} + \barc{7} + \barc{3} + \end{barchart} +\end{figure} +\end{quote} + +The only arguments that are mandatory is the bar value. The charts can be changed using a few simple options such as \texttt{min}, \texttt{max} and \texttt{step}. + +\begin{quote}\small +\begin{verbatim} +\begin{barchart}[min = 0, max = 60, step = 10, height=0.25em] + \barc{30} + \barc{20} + \barc{50} +\end{barchart} +\end{verbatim} +\end{quote} +\begin{quote}\small +\begin{figure}[ht] + \begin{barchart}[min = 0, max = 60, step = 10, height=0.25em] + \barc{30} + \barc{20} + \barc{50} + \end{barchart} +\end{figure} +\end{quote} + +\texttt{height} is used to set the height of the whole chart. Omitting a height on charts with large \texttt{max} values will make the chart enormous. + +\section{Bars} +Each bar can be customized to your liking. This can be done using \texttt{color}, \texttt{width} and \texttt{plain}. +\texttt{color} changes the color of each bar like: + + +\begin{quote}\small +\begin{verbatim} +\begin{barchart}[step = 2] + \barc[color=yellow!60]{5} + \barc[color=orange!60]{7} + \barc[color=cyan!60]{3} +\end{barchart} +\end{verbatim} +\end{quote} +\begin{quote}\small +\begin{figure}[ht] + \begin{barchart}[step = 2] + \barc[color=yellow!60]{5} + \barc[color=orange!60]{7} + \barc[color=cyan!60]{3} + \end{barchart} +\end{figure} +\end{quote} + +\texttt{width} changes the width of each bar: + +\begin{quote}\small +\begin{verbatim} +\begin{barchart}[step = 2] + \barc[width=40pt]{5} + \barc[width=30pt]{7} + \barc[width=50pt]{3} + \barc[width=20pt]{3} +\end{barchart} +\end{verbatim} +\end{quote} +\begin{quote}\small +\begin{figure}[ht] + \begin{barchart}[step = 2] + \barc[width=40pt]{5} + \barc[width=30pt]{7} + \barc[width=50pt]{3} + \barc[width=20pt]{3} + \end{barchart} +\end{figure} +\end{quote} +Using less than \texttt{20pt} is not recommended. Instead of using pre-defined step as the examples have shown so far, \texttt{steps} can be used. + +\begin{quote}\small +\begin{verbatim} +\begin{barchart}[steps = {1,3,5,7,10}] + \barc{5} + \barc{7} + \barc{3} +\end{barchart} +\end{verbatim} +\end{quote} +\begin{quote}\small +\begin{figure}[ht] + \begin{barchart}[steps = {1,3,5,7,10}] + \barc{5} + \barc{7} + \barc{3} + \end{barchart} +\end{figure} +\end{quote} + +\texttt{plain} is a boolean which can either be \texttt{true} or \texttt{false} and removes the label on the bar. +\begin{quote}\small +\begin{verbatim} +\begin{barchart} + \barc{5} + \barc[plain=true]{7} + \barc[plain=true]{3} +\end{barchart} +\end{verbatim} +\end{quote} +\begin{quote}\small +\begin{figure}[ht] + \begin{barchart} + \barc{5} + \barc[plain=true]{7} + \barc[plain=true]{3} + \end{barchart} +\end{figure} +\end{quote} + + +\section{Skips} + +\section{Labels} + +\section{Scaling} + +\section{Known Issues} + +\end{document} \ No newline at end of file diff --git a/barchart/barchart_example.pdf b/barchart/barchart_example.pdf new file mode 100644 index 0000000..ab78811 Binary files /dev/null and b/barchart/barchart_example.pdf differ diff --git a/barchart/barchart_example.tex b/barchart/barchart_example.tex new file mode 100644 index 0000000..f00a84c --- /dev/null +++ b/barchart/barchart_example.tex @@ -0,0 +1,47 @@ +\documentclass[]{article} +\usepackage{barchart} + + +\begin{document} +\section{Bar Chart Example} + +\begin{figure}[ht] + \begin{barchart}[min = 0, max = 10, step = 2, height = 0.75em, scale = 2, label=Something nice] + \barc[label = test, rotation = true, width = 20pt, color = blue!60]{1} + \barcskip{5pt} + \barc[width = 20pt, color = cyan!60]{3} + \barcskip{5pt} + \barc[width = 20pt, color = yellow!60]{7} + \barcskip{5pt} + \barc[label = a long label, rotation = true,width = 20pt, color = orange!60]{5} + \barcskip{5pt} + \barc[width = 20pt, color = red!60]{3} + \barcskip{5pt} + \barc[color = magenta!60]{6} + \barcskip{5pt} + \barc[color = green!60]{6} + \barcskip{5pt} + \barc[label = lol,color = green!60]{9} + \barcskip{5pt} + \barc[color = green!60, plain=true]{3} + \barcskip{5pt} + \barc[color = green!60]{3} + \barcskip{5pt} + \barc[label = again?, rotation=true, color = green!60, plain=true]{3} + \barcskip{5pt} + \barc[color = green!60, label=a loooong label]{3} + \end{barchart} + \caption{A nice caption} +\end{figure} + +\begin{figure}[ht] + \begin{barchart}[min = 0, max = 100, step = 10, height = 0.5ex, scale = 1, label=Something nice] + \barc[label = test, width = 20pt, color = blue!60]{50} + \barcskip{5pt} + \barc[width = 30pt, color = cyan!60]{75} + \barcskip{5pt} + \end{barchart} + \caption{A nice caption} +\end{figure} + +\end{document} \ No newline at end of file