我正在将Seaborn regplots绘制为子图,并希望每一行的调色板都相同。
我正在使用Python进行实验设计分析,并且在绘制与Seaborn的交互效果时遇到了问题。
我希望每一行的颜色对都相同,但是我找不到通过matplotlib或seaborn方法来实现的方法。我尝试了其他问题的“ with sns.color_palette()”和“ ax.set_prop_cycle()”建议,但图中显示的内容与不包含它们的情况相同。
这将生成数据框
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import itertools as it
encoded_inputs = list( it.product([-1, 1], [-1, 1], [-1, 1]) )
doe = pd.DataFrame(encoded_inputs, columns=['x1', 'x2', 'x3'])
doe['y1'] = doe.apply( lambda z : sum([ np.random.rand()*z["x%d"%(i)]+0.01*(0.5-np.random.rand()) for i in range(1,3) ]), axis=1)
print(doe)
这将生成带有子图的图形:
factors = ['x1', 'x2', 'x3']
f, axs = plt.subplots(3, 3, figsize=(12, 12))
for i in range(len(factors)):
for j in range(len(factors)):
yy = factors[j]
with sns.color_palette('Paired'):
sns.regplot(x=factors[i], y='y1', data=doe[doe[yy]==-1], label='-1', x_estimator=np.mean, ci=None, truncate=True, ax=axs[j,i])
sns.regplot(x=factors[i], y='y1', data=doe[doe[yy]==1], label='1', x_estimator=np.mean, ci=None, truncate=True, ax=axs[j,i])
axs[j,i].legend(title=yy,facecolor='white')
if i==j:
axs[j,i].clear()
for ax in axs.flat:
ax.set_ylabel(None)
plt.tight_layout()
plt.show()
实际结果是调色板按绘制顺序在所有子图中循环显示。 我希望能够在开始绘制新列的子图或同步两个子图的颜色时重置调色板迭代器。