Seaborn:标题和字幕位置

时间:2018-10-21 10:42:22

标签: python matplotlib plot seaborn

全部,

我想创建一个散点图,其标题,副标题,对应于特定变量的颜色和对应于另一个变量的大小。我想显示颜色图例,而不是大小。这是我到目前为止的内容:

# imports
import seaborn as sns
import matplotlib
from matplotlib import style
import matplotlib.pyplot as plt

# parameters
matplotlib.rcParams['font.family'] = "roboto"
style.use('fivethirtyeight')

# load data
iris = sns.load_dataset('iris')

# plot
ax = sns.relplot(
    'sepal_length',
    'sepal_width',
    hue='species',
    size='petal_width',
    alpha=0.75,
    kind="scatter",
    legend=False,
    data=iris
)

# make adjustments
ax.set_axis_labels(x_var='Sepal Length', y_var='Sepal Width')
plt.text(x=4.7, y=4.7, s='Sepal Length vs Width', fontsize=16, weight='bold')
plt.text(x=4.7, y=4.6, s='The size of each point corresponds to sepal width', fontsize=8, alpha=0.75)
plt.show()

输出:

scatterplot

这是我的问题:

1)是否有更好的字幕设置方法?我使用ax.suptitle("blah", y=1.05)进行了尝试,但最终结果超出了图的范围。我不喜欢我必须为标题/字幕设置x和y坐标。

2)我可以在不显示尺寸图例的情况下显示颜色图例吗?我还希望能够在图的下方(或外部)显示此图例。 如果您可以回答该问题,我将更改此帖子的标题,将您的答案标记为完成,并创建另一个有关标题和字幕的问题

非常感谢!

1 个答案:

答案 0 :(得分:3)

使用scatterplot()可以更轻松地操作图例。如果您使用legend='brief,则会得到以下图例:

enter image description here

您可以使用以下方法获得艺术家和用于创建此图例的标签:

h,l = ax.get_legend_handles_labels()

由于您只需要颜色信息,而不是尺寸,解决方案是使用艺术家的前半部分重新创建图例

ax.legend(h[:4],l[:4])

完整代码:

matplotlib.style.use('fivethirtyeight')
# load data
iris = sns.load_dataset('iris')

# plot
fig, ax = plt.subplots(figsize=(7,5))
sns.scatterplot(
    'sepal_length',
    'sepal_width',
    hue='species',
    size='petal_width',
    alpha=0.75,
    legend='brief',
    data=iris,
    ax=ax
)

# make adjustments
ax.set_xlabel('Sepal Length')
ax.set_ylabel('Sepal Width')

ax.text(x=0.5, y=1.1, s='Sepal Length vs Width', fontsize=16, weight='bold', ha='center', va='bottom', transform=ax.transAxes)
ax.text(x=0.5, y=1.05, s='The size of each point corresponds to sepal width', fontsize=8, alpha=0.75, ha='center', va='bottom', transform=ax.transAxes)

h,l = ax.get_legend_handles_labels()
ax.legend(h[:4],l[:4], bbox_to_anchor=(1.05, 1), loc=2)

fig.tight_layout()
plt.show()

enter image description here