Морские палитры - предотвращать рециркуляцию цветов

Seaborn позволяет определять цветовые палитры, которые содержат несколько цветов, полезно для диаграмм со многими строками. Однако при настройке палитры на один с несколькими цветами используются только первые шесть, после чего цвета перерабатываются, что затрудняет выделение строк. Это можно переопределить, явно называя палитру, но это не удобно. Есть ли способ заставить текущую палитру Seaborn не перерабатывать цвета, если определено более 6?

Пример:

from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sb

# Define a palette with 8 colors
cmap = sb.blend_palette(["firebrick", "palegreen"], 8) 
sb.palplot(cmap)

palette with 6 colors

# Set the current palette to this; only 6 colors are used
sb.set_palette(cmap)
sb.palplot(sb.color_palette() )

palette with 6 colors

df = pd.DataFrame({x:[x*10, x*10+5, x*10+10] for x in range(8)})
fig, (ax1, ax2) = plt.subplots(2,1,figsize=(4,6))
# Using the current palette, colors repeat 
df.plot(ax=ax1) 
ax1.legend(bbox_to_anchor=(1.2, 1)) 
# using the palette that defined the current palette, colors don't repeat
df.plot(ax=ax2, color=cmap) 
ax2.legend(bbox_to_anchor=(1.2, 1))  ;

charts with 6 or 8 colors used

Ответ 1

Решение (спасибо @tcaswell для указателя): установите палитру в явном виде, используя все цвета:

# Setting the palette using defaults only finds 6 colors
sb.set_palette(cmap)
sb.palplot(sb.color_palette() )
sb.palplot(sb.color_palette(n_colors=8) )

# but setting the number of colors explicitly allows it to use them all
sb.set_palette(cmap, n_colors=8)
# Even though unless you explicitly request all the colors it only shows 6
sb.palplot(sb.color_palette() )
sb.palplot(sb.color_palette(n_colors=8) )

enter image description hereenter image description hereenter image description hereenter image description here

# In a chart, the palette now has access to all 8 
fig, ax1 = plt.subplots(1,1,figsize=(4,3)) 
df.plot(ax=ax1) 
ax1.legend(bbox_to_anchor=(1.2, 1)) ;

enter image description here