如何在 matplotlib 和 LaTeX 之间匹配 cmyk 颜色

如何在 matplotlib 和 LaTeX 之间匹配 cmyk 颜色

matplotlib我正在使用颜色图绘制一些东西matplotlib.cm.rainbow。我需要在我的 LaTeX 文档中匹配相同的颜色,但我很难使绘图上的颜色与 LaTeX 文档中的颜色相匹配。

我要怎么做才能让 matplotlib 和 LaTeX 使用相同的颜色?即使接近也会有好处。

我用来绘图的代码matplotlib是:

import matplotlib.pyplot as pyplot

Fig, ax = pyplot.subplots()
indices = range(8)

length = len(indices)
print("\ncolors: ")
for i in range(length-1):
    left = indices[i]
    right = indices[i+1]

    c = pyplot.cm.rainbow(i/length)
    print("i={}, color={}".format(i,c))
    ax.fill_between((left,right), 0,1,
                    facecolor=c, edgecolor=c, alpha=0.25)

# Do the last one
i +=1
left = indices[i]
right = 8
c = pyplot.cm.rainbow(1.0)
print("i={}, color={}".format(i,c))
ax.fill_between((left,right), 0,1,
                facecolor=c, edgecolor=c, alpha=0.25)

输出结果如下:

colors: 
i=0, color=(0.5, 0.0, 1.0, 1.0)
i=1, color=(0.24901960784313726, 0.38410574917192586, 0.98063477046897773, 1.0)
i=2, color=(0.0019607843137254832, 0.70928130760585339, 0.92328910610548931, 1.0)
i=3, color=(0.25294117647058822, 0.92563765978155632, 0.83018403081555059, 1.0)
i=4, color=(0.50392156862745097, 0.99998102734872685, 0.70492554690614728, 1.0)
i=5, color=(0.75490196078431371, 0.92090551794495368, 0.55236497296050591, 1.0)
i=6, color=(1.0, 0.70054303759329106, 0.37841105004231035, 1.0)
i=7, color=(1.0, 1.2246467991473532e-16, 6.123233995736766e-17, 1.0)

matplotlib 绘图输出

我使用输出来定义 LaTeX 中的颜色:

\definecolor{colorA}{cmyk}{0.5    , 0.0    , 1.0     , 0.0}
\definecolor{colorB}{cmyk}{0.2490 , 0.3841 , 0.9806  , 0.0}
\definecolor{colorC}{cmyk}{0.0019 , 0.7092 , 0.9232  , 0.0}
\definecolor{colorD}{cmyk}{0.2529 , 0.9256 , 0.8301  , 0.0}
\definecolor{colorE}{cmyk}{0.5039 , 0.9999 , 0.7049  , 0.0}
\definecolor{colorF}{cmyk}{0.7549 , 0.9209 , 0.5523  , 0.0}
\definecolor{colorG}{cmyk}{1.0    , 0.7005 , 0.37841 , 0.0}
\definecolor{colorH}{cmyk}{1.0    , 1.2246 , 6.12323 , 0.0}

colortbl最后,我使用命令在表格(带有包)中使用颜色

\rowcolor{colorA!25} 1 & ... 

但是,图中的颜色与表格中的颜色不匹配,这让我很恼火,为什么它不起作用。与purple, blue, aqua, ...图中所示的(我知道这些不是技术颜色名称)不同,我得到的颜色是green, orange, orange red, red, gray red, violet, blue,...这些颜色甚至不接近。

答案1

您的问题很简单,它pyplot.cm.rainbow不返回 CMYK 值,而是返回 RGB + alpha。摘自文档字符串:

返回

如果 X 是标量,则为 RGBA 值的元组,否则为具有形状的 RGBA 值数组X.shape + (4, )

因此,通过使用

\definecolor{colorname}{rgb}{a,b,c}

a,b,c前三个值来自哪里rainbow,颜色匹配。(请colorH注意gb值(非常接近)0,而不是 1.22 和 6.12,但这可能只是复制粘贴错误。)

\documentclass{article}
\usepackage{graphicx}
\usepackage[table]{xcolor}
\definecolor{colorA}{rgb}{0.5    , 0.0    , 1.0     }
\definecolor{colorB}{rgb}{0.2490 , 0.3841 , 0.9806  }
\definecolor{colorC}{rgb}{0.0019 , 0.7092 , 0.9232  }
\definecolor{colorD}{rgb}{0.2529 , 0.9256 , 0.8301  }
\definecolor{colorE}{rgb}{0.5039 , 0.9999 , 0.7049  }
\definecolor{colorF}{rgb}{0.7549 , 0.9209 , 0.5523  }
\definecolor{colorG}{rgb}{1.0    , 0.7005 , 0.37841 }
\definecolor{colorH}{rgb}{1.0    , 0.0    , 0.0     }
\begin{document}
\includegraphics{colors}

\begin{tabular}{*{8}{c}}
\cellcolor{colorA!25}\phantom{\rule{1cm}{4cm}} &
\cellcolor{colorB!25}\phantom{\rule{1cm}{4cm}} &
\cellcolor{colorC!25}\phantom{\rule{1cm}{4cm}} &
\cellcolor{colorD!25}\phantom{\rule{1cm}{4cm}} &
\cellcolor{colorE!25}\phantom{\rule{1cm}{4cm}} &
\cellcolor{colorF!25}\phantom{\rule{1cm}{4cm}} &
\cellcolor{colorG!25}\phantom{\rule{1cm}{4cm}} &
\cellcolor{colorH!25}\phantom{\rule{1cm}{4cm}} 
\end{tabular}
\end{document}

在此处输入图片描述

相关内容