seaborn 中的叠加图导致 x 轴未对齐
Superimposing plots in seaborn cause x-axis to misallign
我在尝试用 seaborn 叠加绘图时遇到问题。我能够分别生成这两个图
fig, (ax1,ax2) = plt.subplots(ncols=2,figsize=(30, 7))
sns.lineplot(data=data1, y='MSE',x='pct_gc',ax=ax1)
sns.boxplot(x="pct_gc", y="MSE", data=data2,ax=ax2,width=0.4)
输出如下所示:
但是当我尝试将两个图叠加在一起,但将它们分配给同一个 ax 对象时。
fig, (ax1,ax2) = plt.subplots(ncols=2,figsize=(30, 7))
sns.lineplot(data=data1, y='MSE',x='pct_gc',ax=ax1)
sns.boxplot(x="pct_gc", y="MSE", data=data2,ax=ax2,width=0.4)
当叠加两个图(两个图的 X 轴从 0 到 0.069)时,我无法识别线图中 X 轴的变化。
我的目标是叠加两个图,同时保持相同的 X 轴范围。
Seaborn 的 boxplot
创建分类 x-axis,所有框都很好地具有相同的距离。在内部 x-axis 编号为 0, 1, 2, ...
但在外部它获得从 0 到 0.069 的标签。
要将线图与 boxplot
结合起来,matplotlib 的 boxplot
可以直接寻址,这样 positions
和 widths
就可以显式设置了。当 patch_artist=True
时,会创建一个矩形(而不只是线条),可以为其指定 facecolor
。 manage_ticks=False
防止 boxplot
更改 x 刻度及其限制。可选 notch=True
会更加突出中位数,但根据数据,置信区间可能太大并且看起来很奇怪。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
data1 = pd.DataFrame({'pct_gc': np.linspace(0, 0.069, 200), 'MSE': np.random.normal(0.02, 0.1, 200).cumsum()})
data1['pct_range'] = pd.cut(data1['pct_gc'], 10)
fig, ax1 = plt.subplots(ncols=1, figsize=(20, 7))
sns.lineplot(data=data1, y='MSE', x='pct_gc', ax=ax1)
for interval, color in zip(np.unique(data1['pct_range']), plt.cm.tab10.colors):
ax1.boxplot(data1[data1['pct_range'] == interval]['MSE'],
positions=[interval.mid], widths=0.4 * interval.length,
patch_artist=True, boxprops={'facecolor': color},
notch=False, medianprops={'color':'yellow', 'linewidth':2},
manage_ticks=False)
plt.show()
我在尝试用 seaborn 叠加绘图时遇到问题。我能够分别生成这两个图
fig, (ax1,ax2) = plt.subplots(ncols=2,figsize=(30, 7))
sns.lineplot(data=data1, y='MSE',x='pct_gc',ax=ax1)
sns.boxplot(x="pct_gc", y="MSE", data=data2,ax=ax2,width=0.4)
输出如下所示:
但是当我尝试将两个图叠加在一起,但将它们分配给同一个 ax 对象时。
fig, (ax1,ax2) = plt.subplots(ncols=2,figsize=(30, 7))
sns.lineplot(data=data1, y='MSE',x='pct_gc',ax=ax1)
sns.boxplot(x="pct_gc", y="MSE", data=data2,ax=ax2,width=0.4)
当叠加两个图(两个图的 X 轴从 0 到 0.069)时,我无法识别线图中 X 轴的变化。
我的目标是叠加两个图,同时保持相同的 X 轴范围。
Seaborn 的 boxplot
创建分类 x-axis,所有框都很好地具有相同的距离。在内部 x-axis 编号为 0, 1, 2, ...
但在外部它获得从 0 到 0.069 的标签。
要将线图与 boxplot
结合起来,matplotlib 的 boxplot
可以直接寻址,这样 positions
和 widths
就可以显式设置了。当 patch_artist=True
时,会创建一个矩形(而不只是线条),可以为其指定 facecolor
。 manage_ticks=False
防止 boxplot
更改 x 刻度及其限制。可选 notch=True
会更加突出中位数,但根据数据,置信区间可能太大并且看起来很奇怪。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
data1 = pd.DataFrame({'pct_gc': np.linspace(0, 0.069, 200), 'MSE': np.random.normal(0.02, 0.1, 200).cumsum()})
data1['pct_range'] = pd.cut(data1['pct_gc'], 10)
fig, ax1 = plt.subplots(ncols=1, figsize=(20, 7))
sns.lineplot(data=data1, y='MSE', x='pct_gc', ax=ax1)
for interval, color in zip(np.unique(data1['pct_range']), plt.cm.tab10.colors):
ax1.boxplot(data1[data1['pct_range'] == interval]['MSE'],
positions=[interval.mid], widths=0.4 * interval.length,
patch_artist=True, boxprops={'facecolor': color},
notch=False, medianprops={'color':'yellow', 'linewidth':2},
manage_ticks=False)
plt.show()