全部,
我想创建一个散点图,其标题,副标题,对应于特定变量的颜色和对应于另一个变量的大小。我想显示颜色图例,而不是大小。这是我到目前为止的内容:
# 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()
输出:
这是我的问题:
1)是否有更好的字幕设置方法?我使用ax.suptitle("blah", y=1.05)
进行了尝试,但最终结果超出了图的范围。我不喜欢我必须为标题/字幕设置x和y坐标。
2)我可以在不显示尺寸图例的情况下显示颜色图例吗?我还希望能够在图的下方(或外部)显示此图例。 如果您可以回答该问题,我将更改此帖子的标题,将您的答案标记为完成,并创建另一个有关标题和字幕的问题
非常感谢!
答案 0 :(得分:3)
使用scatterplot()
可以更轻松地操作图例。如果您使用legend='brief
,则会得到以下图例:
您可以使用以下方法获得艺术家和用于创建此图例的标签:
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()