根据条目数自动选择 pgfplots 中的预设配色方案

根据条目数自动选择 pgfplots 中的预设配色方案

这实际上更多的是为了满足个人好奇心而不是为了解决实际问题。

在为我的图选择配色方案时,我会尝试选择与图中涉及的项目数量相匹配的颜色。这意味着使用一组首先美观,而且对比度好的颜色等。(例如,使用类似这样的网站创建的方案)。

不过,我想知道是否可以定义一组效果良好的 2,3,4,...,n 种颜色,并让 pgfplots(或其他包?)从与条目数量匹配的颜色中自动选择。

我四处寻找类似的问题,但似乎什么也没找到。颜色集可以定义为循环列表,但我对自动选择感到疑惑。可以这样做吗?有什么想法吗?

答案1

这只是一条较长的评论。我可能对工作流程的理解有误,如果是这样的话,希望我能得到纠正。

事情pgfplots不会一下子全部发生。首先,您的绘图命令和轴选项会被解析并存储为 PGF 路径。然后,可视化方案开始生效(我不确定顺序),并指定路径颜色、图例样式等。然后,使用低级 TikZ/PGF 命令绘制它们。

为了选择循环列表,需要先收集图表,以便对其进行计数。但这可能太晚了,无法更改绘图选项。我认为此功能不支持现成的功能。

请注意,这是一个非常粗略的描述,每一层都会检查很多东西,所以不要太过于字面化。

但是如果您愿意提供绘图项的数量,那么就需要定义一个样式,并使用参数选择预定义的绘图循环列表。

答案2

作为敲击克里斯蒂安·费尔桑格在答案和评论中提到过,没有办法自动选择包含适当数量项目的循环列表。

但至少从 PGFPlots v1.13 开始colorbrewer库就被添加到了包中(参见手册第 397 页第 5.2 节),其中引入了 Cynthia Brewer 创作的配色方案,发布于http://colorbrewer2.orgPGFPlots 为colormaps 以及cycle lists。以下是该库中的两个或多或少随机的示例。

\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
    \usetikzlibrary{
        pgfplots.colorbrewer,
    }
    \pgfplotsset{
        cycle from colormap manual style/.style={
            x=3cm,y=10pt,ytick=\empty,
            stack plots=y,
            every axis plot/.style={line width=2pt},
        },
    }
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            cycle list/RdYlBu-6,
            cycle from colormap manual style,
        ]
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
        \end{axis}
    \end{tikzpicture}
    \begin{tikzpicture}
        \begin{axis}[
            cycle list/Set1,
            cycle from colormap manual style,
        ]
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
            \addplot coordinates {(0,1) (1,1)};
        \end{axis}
    \end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容