我想在我的 LaTeX 文档中包含一些或多或少复杂的图表。我附上了一张图片,展示了它应该是什么样子。LaTeX 中是否有任何图表包允许我在文档中包含此类图表?还是我必须使用 Excel 或任何其他工具来执行此操作?
论文图片:漏洞的秘密生活:探究软件存储库中的错误和遗漏
答案1
这是我的解决方案,始终基于 TikZ。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds,shadings}
\newcommand{\barwidth}{2}
\newcommand{\barheight}{0.5}
\newcommand{\thescale}{100}
\newcommand{\setscale}[1]{\renewcommand{\thescale}{#1}}
\newcommand{\shadebar}[2][]{
\node[rectangle,minimum width=\barwidth cm,minimum height=\barheight cm,](a){};
\node[left] at(a.east){\ensuremath{#2\%}};
\ifnum#2=0
\def\shadebarwidth{0.01/\barwidth}
\else
\def\shadebarwidth{(#2/\thescale)*\barwidth}
\fi
\begin{pgfonlayer}{background}
\node[left color=#1,right color=white,draw=white,minimum width=\shadebarwidth cm,minimum height=\barheight cm,right]at (a.west){};
\end{pgfonlayer}
}
\begin{document}
\setscale{20}
\noindent
\tikz{\shadebar[green]{16}}\\
\tikz{\shadebar[red]{10}}\\
\setscale{100}
\tikz{\shadebar[blue]{60}}\\
\tikz{\shadebar[green]{100}}
\vspace{5cm}
\begin{tabular}{lp{\barwidth cm}p{\barwidth cm}p{\barwidth cm}}
Probing for ownership &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar[blue]{16}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar[blue]{69}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{52}}\\
Summit &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar[blue]{1}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar[blue]{2}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{50}}\\
Probing for expertise &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar[blue]{17}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar[blue]{34}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{49}}\\
\end{tabular}
\end{document}
基本上,它允许您定义条形图,您可以自定义条形图的宽度、颜色和比例。这是因为,您可能想更改图表的比例因子。
标签介绍
引入标签而不是简单的数字是一个解决方案:
\newcommand{\labeledshadebar}[3][]{
\node[rectangle,minimum width=\barwidth cm,minimum height=\barheight cm,](a){};
\node[left] at(a.east){#3};
\ifnum#2=0
\def\shadebarwidth{0.01/\barwidth}
\else
\def\shadebarwidth{(#2/\thescale)*\barwidth}
\fi
\begin{pgfonlayer}{background}
\node[left color=#1,right color=white,draw=white,minimum width=\shadebarwidth cm,minimum height=\barheight cm,right]at (a.west){};
\end{pgfonlayer}
}
新命令的使用方式如下:
\tikz{\labeledshadebar[green]{16}{yes}}For example, changing the `document` content into:
\begin{document}
\setscale{20}
\noindent
\tikz{\shadebar[green]{16}}\\
\tikz{\labeledshadebar[green]{16}{yes}}\\
\tikz{\shadebar[red]{10}}\\
\setscale{100}
\tikz{\shadebar[blue]{60}}\\
\tikz{\labeledshadebar[blue]{60}{no}}\\
\tikz{\shadebar[green]{100}}
\vspace{2cm}
\begin{tabular}{lp{\barwidth cm}p{\barwidth cm}p{\barwidth cm}}
Probing for ownership &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar[blue]{16}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar[blue]{69}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{52}}\\
Summit &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar[blue]{1}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar[blue]{2}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{50}}\\
Probing for expertise &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar[blue]{17}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar[blue]{34}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{49}}\\
\end{tabular}
\end{document}
有可能得到:
Xparse 实现
为了使事情变得简单并且只有一个命令,可以通过定义重新定义上述命令xparse
:
\NewDocumentCommand{\shadebar}{O{blue} m o}{%
\node[rectangle,minimum width=\barwidth cm,minimum height=\barheight cm,](a){};
\IfNoValueTF{#3}{%true
\node[left] at(a.east){\ensuremath{#2\%}};
}
{%false
\node[left] at(a.east){#3};
}
\ifnum#2=0
\def\shadebarwidth{0.01/\barwidth}
\else
\def\shadebarwidth{(#2/\thescale)*\barwidth}
\fi
\begin{pgfonlayer}{background}
\node[left color=#1,right color=white,draw=white,minimum width=\shadebarwidth cm,minimum height=\barheight cm,right]at (a.west){};
\end{pgfonlayer}
}
现在,带有标签的最后示例可以简化了;为了允许在和的文档内部进行自定义\barwidth
,\barheight
我插入了两个专用命令\setbarwidth
和\setbarheight
。
\documentclass{article}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{backgrounds,shadings}
\newcommand{\barwidth}{2}
\newcommand{\barheight}{0.5}
\newcommand{\thescale}{100}
% To allow customization inside the document
\newcommand{\setscale}[1]{\renewcommand{\thescale}{#1}}
\newcommand{\setbarwidth}[1]{\renewcommand{\barwidth}{#1}}
\newcommand{\setbarheight}[1]{\renewcommand{\barheight}{#1}}
\NewDocumentCommand{\shadebar}{O{blue} m o}{%
\node[rectangle,minimum width=\barwidth cm,minimum height=\barheight cm,](a){};
\IfNoValueTF{#3}{%true
\node[left] at(a.east){\ensuremath{#2\%}};
}
{%false
\node[left] at(a.east){#3};
}
\ifnum#2=0
\def\shadebarwidth{0.01/\barwidth}
\else
\def\shadebarwidth{(#2/\thescale)*\barwidth}
\fi
\begin{pgfonlayer}{background}
\node[left color=#1,right color=white,draw=white,minimum width=\shadebarwidth cm,minimum height=\barheight cm,right]at (a.west){};
\end{pgfonlayer}
}
\begin{document}
\setbarwidth{3}
\setbarheight{0.75}
\setscale{20}
\noindent
\tikz{\shadebar[green]{16}}\\
\tikz{\shadebar[orange]{16}[yes]}\\
\tikz{\shadebar[red]{10}}\\
\setbarwidth{3.5}
\setbarheight{1}
\setscale{100}
\tikz{\shadebar{60}[no]}\\
\tikz{\shadebar[violet]{60}{no}}\\
\tikz{\shadebar[green!80!black]{100}}
\vspace{2cm}
\setbarwidth{2}
\setbarheight{0.5}
\begin{tabular}{lp{\barwidth cm}p{\barwidth cm}p{\barwidth cm}}
Probing for ownership &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar{16}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar{69}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{52}}\\
Summit &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar{1}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar{2}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{50}}\\
Probing for expertise &\setscale{20}\tikz[baseline=-0.5ex]{\shadebar{17}} &\setscale{70}\tikz[baseline=-0.5ex]{\shadebar{34}} & \setscale{55}\tikz[baseline=-0.5ex]{\shadebar[green]{49}}\\
\end{tabular}
\end{document}
答案2
使用 TikZ 可以轻松实现这样的效果:
\documentclass{standalone}
\usepackage{tikz}
\tikzset{
mystyle/.style={inner sep=0pt, inner ysep = .5mm, anchor=west, text height=2mm},
mynum/.style={inner sep=0pt, inner ysep = .5mm, anchor=east}
}
\begin{document}
\newcommand{\myrow}[4]{%
#1 & \begin{tikzpicture}[baseline=-2pt]\node at (0,0)[ fill = red, text width=#2 cm,mystyle] {}; \node[mynum] at (1cm,0){\pgfmathparse{int(round(#2*100))}\pgfmathresult}; \end{tikzpicture}& %
\begin{tikzpicture}[baseline=-2pt]\node at (0,0)[ fill = blue, text width=#3 cm,mystyle] {}; \node[mynum] at (1cm,0){\pgfmathparse{int(round(#3*100))}\pgfmathresult}; \end{tikzpicture}&%
\begin{tikzpicture}[baseline=-2pt]\node at (0,0)[ fill = green, text width=#4 cm,mystyle] {}; \node[mynum] at (1cm,0){\pgfmathparse{int(round(#4*100))}\pgfmathresult}; \end{tikzpicture}\\
}
\begin{tabular}{lp{1cm}p{1cm}p{1cm}}
\myrow{yes}{1}{.5}{.75}
\myrow{no}{.33}{.2}{.9}
\myrow{maybe}{.02}{.2}{.9}
\end{tabular}
\end{document}
关于你的图片,我只有一件事要说:作为审阅者,我会拒绝那张图片。为什么?看看这个比例尺。这是一个橡胶比例尺。这意味着你的投影点会因单元格而异。这样的单元格无法比较,读者会得到错误的印象;例如 66% 和 52% 看起来完全一样。现在看看我的结果:100% 始终是 1cm。这意味着(除了较小的值)投影始终相同。
答案3
编辑:刚刚注意到您还要求提供 Excel 解决方案。有关详细信息,请参阅sourceforce 上的 sparklinesforxl(另见sparlinesforxl 主站)或使用迷你图功能内置于 Excel 2010。
编辑 2:这是在 Excel 中使用 sparklinesforxl 的示例。我们hbar
在这里使用了该函数。例如,如果单元格a1
包含我们希望以浅蓝色显示的分数,那么我们将公式放入=hbar(a1, 15128749)
我们希望条形图出现的单元格中,或者将其显示为浅绿色=hbar(a1, 9498256)
。
有颜色图表这里它可用于避免颜色计算,尽管在这个例子中,我实际上所做的是从浅绿色的 RGB 值 (144, 238, 144) 和浅蓝色的 RGB 值 (173, 216, 230) 开始,然后使用公式R + 256 * G + 256^2 * B
获取最后一段中参数 2 所示的相应数值。
编辑3:这是一个sparklines
包示例:
\documentclass{article}
\usepackage{colortbl}
\usepackage[table]{xcolor}
\usepackage{sparklines}
\begin{document}
\setlength{\sparklinethickness}{5pt}
\begin{center}
\begin{tabular}{lllllll}
& \multicolumn{2}{l}{\bfseries E} &
\multicolumn{2}{l}{\bfseries O} &
\multicolumn{2}{l}{\bfseries E/O} \\
\bfseries First Line &
16\% & \definecolor{sparklinecolor}{RGB}{173,216,230}
\begin{sparkline}{5} \spark 0.0 0.5 0.16 0.5 / \end{sparkline} &
30\% & \definecolor{sparklinecolor}{RGB}{173,216,230}
\begin{sparkline}{5} \spark 0.0 0.5 0.30 0.5 / \end{sparkline} &
53\% & \definecolor{sparklinecolor}{RGB}{144,238,144}
\begin{sparkline}{5} \spark 0.0 0.5 0.53 0.5 / \end{sparkline} \\
\bfseries Second Line &
10\% & \definecolor{sparklinecolor}{RGB}{173,216,230}
\begin{sparkline}{5} \spark 0.0 0.5 0.10 0.5 / \end{sparkline} &
20\% & \definecolor{sparklinecolor}{RGB}{173,216,230}
\begin{sparkline}{5} \spark 0.0 0.5 0.20 0.5 / \end{sparkline} &
50\% & \definecolor{sparklinecolor}{RGB}{144,238,144}
\begin{sparkline}{5} \spark 0.0 0.5 0.50 0.5 / \end{sparkline} \\
\end{tabular}
\end{center}
\end{document}