当我尝试组合
regplot
和 violinplot
时,它们被绘制在不同的位置。
df = pd.DataFrame({'Magnitudes': magnitudes, 'Lengths': np.log10(lengths), 'Widths': np.log10(widths)})
# Colors for violins
palette = sns.color_palette("Set2", len(fullpaths))
sns.set_style("darkgrid", {"grid.color": ".6", "grid.linestyle": ":"})
# Crear gráficos de violín con regresión lineal y personalización de color
plt.figure()
plt.subplot(2, 1, 1)
sns.regplot(x='Magnitudes', y='Lengths', data=df,scatter_kws={"alpha" : 0.0})
sns.violinplot(x='Magnitudes', y='Lengths', data=df, palette=palette, alpha=0.5,hue='Magnitudes',legend=False)
plt.title('Violin Plot of Lengths vs Magnitude')
plt.xlabel('Magnitude')
plt.ylabel('Lengths')
plt.subplot(2, 1, 2)
sns.regplot(x='Magnitudes', y='Widths', data=df,scatter_kws={"alpha" : 0.0})
sns.violinplot(x='Magnitudes', y='Widths', data=df, palette=palette, alpha=0.5,hue='Magnitudes',legend=False)
plt.title('Violin Plot of Widths vs Magnitude')
plt.xlabel('Magnitude')
plt.ylabel('Widths')
默认情况下,seaborn 绘制分类图,例如带有分类 x 轴的小提琴图(或箱线图、条形图……)。在内部,它们位于位置
0, 1, 2, ...
。从 Seaborn 0.13 开始,这些函数接受参数 native_scale=True
,它将小提琴定位在其真实的数字位置(这只适用于数字 x 轴)。如果这些位置不能很好地以相同的距离递增,则使用两把小提琴之间的最小距离作为其宽度的参考。
这是一个示例,包括虚拟测试数据,并使用 matplotlib 的“现代”面向对象的界面(当有多个子图时强烈推荐)。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# create some dummy test data
magnitudes = np.repeat(np.arange(8.1, 9.3001, 0.1), 50)
unique_magnitudes = np.unique(magnitudes)
lengths = 10 ** np.random.normal(0.1, 1, size=len(magnitudes)).cumsum()
widths = 10 ** np.random.normal(0.1, 1, size=len(magnitudes)).cumsum()
df = pd.DataFrame({'Magnitudes': magnitudes, 'Lengths': np.log10(lengths), 'Widths': np.log10(widths)})
# Colors for violins
palette = sns.color_palette("Set2", len(unique_magnitudes))
sns.set_style("darkgrid", {"grid.color": ".6", "grid.linestyle": ":"})
fig, (ax1, ax2) = plt.subplots(ncols=1, nrows=2, figsize=(10, 7))
sns.regplot(x='Magnitudes', y='Lengths', data=df, scatter_kws={"alpha": 0.0}, ax=ax1)
sns.violinplot(x='Magnitudes', y='Lengths', data=df, palette=palette, alpha=0.5, hue='Magnitudes', legend=False,
native_scale=True, ax=ax1)
ax1.set_title('Violin Plot of Lengths vs Magnitude')
ax1.set_xticks(unique_magnitudes) # make sure each x-position is labeled
sns.regplot(x='Magnitudes', y='Widths', data=df, scatter_kws={"alpha": 0.0}, ax=ax2)
sns.violinplot(x='Magnitudes', y='Widths', data=df, palette=palette, alpha=0.5, hue='Magnitudes', legend=False,
native_scale=True, ax=ax2)
ax2.set_title('Violin Plot of Widths vs Magnitude')
ax2.set_xticks(unique_magnitudes)
plt.tight_layout() # spacing for titles and labels
plt.show()