<p>我确实有这个问题,但我需要连续的绘图,以具有高度对比的颜色。我还使用一个包含参考数据的公共子图进行绘图,因此我希望颜色序列能够一致地重复</p>
<p>我最初只是尝试随机生成颜色,在每个绘图之前重新播种RNG。这工作正常(在下面的代码中注释),但可能会产生几乎无法区分的颜色。我想要高对比度的颜色,理想的是从包含所有颜色的颜色贴图中采样</p>
<p>在一个绘图中,我可以有多达31个数据系列,所以我将彩色地图分为许多步骤。然后我按一定的顺序走着,这样我就不会很快回到某个特定颜色的街区</p>
<p>我的数据是在一个高度不规则的时间序列中,所以我想看到点和线,点的颜色与线的颜色相反</p>
<p>考虑到以上所有因素,最简单的方法是生成一个包含相关参数的字典,用于绘制各个系列,然后将其作为调用的一部分展开</p>
<p>这是我的密码。也许不漂亮,但很实用</p>
<pre><code>from matplotlib import cm
cmap = cm.get_cmap('gist_rainbow') #('hsv') #('nipy_spectral')
max_colors = 31 # Constant, max mumber of series in any plot. Ideally prime.
color_number = 0 # Variable, incremented for each series.
def restart_colors():
global color_number
color_number = 0
#np.random.seed(1)
def next_color():
global color_number
color_number += 1
#color = tuple(np.random.uniform(0.0, 0.5, 3))
color = cmap( ((5 * color_number) % max_colors) / max_colors )
return color
def plot_args(): # Invoked for each plot in a series as: '**(plot_args())'
mkr = next_color()
clr = (1 - mkr[0], 1 - mkr[1], 1 - mkr[2], mkr[3]) # Give line inverse of marker color
return {
"marker": "o",
"color": clr,
"mfc": mkr,
"mec": mkr,
"markersize": 0.5,
"linewidth": 1,
}
</code></pre>
<p>我的上下文是JupyterLab和Pandas,下面是示例绘图代码:</p>
<pre><code>restart_colors() # Repeatable color sequence for every plot
fig, axs = plt.subplots(figsize=(15, 8))
plt.title("%s + T-meter"%name)
# Plot reference temperatures:
axs.set_ylabel("°C", rotation=0)
for s in ["T1", "T2", "T3", "T4"]:
df_tmeter.plot(ax=axs, x="Timestamp", y=s, label="T-meter:%s" % s, **(plot_args()))
# Other series gets their own axis labels
ax2 = axs.twinx()
ax2.set_ylabel(units)
for c in df_uptime_sensors:
df_uptime[df_uptime["UUID"] == c].plot(
ax=ax2, x="Timestamp", y=units, label="%s - %s" % (units, c), **(plot_args())
)
fig.tight_layout()
plt.show()
</code></pre>
<p>生成的绘图可能不是最好的示例,但当以交互方式放大时,它会变得更加相关。
<a href="https://i.stack.imgur.com/jzO7a.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/jzO7a.png" alt="uptime + T-meter"/></a></p>