如何在Seaborn FacetGrid中更改子图标题和轴标签的位置?

时间:2017-05-09 16:29:47

标签: python matplotlib plot seaborn polar-coordinates

我正在尝试使用Seaborn的facetGrid绘制极地情节,类似于seaborn's gallery上的详细内容 我使用以下代码:

sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1.25)

# Set up a grid of axes with a polar projection
g = sns.FacetGrid(df_total, col="Construct", hue="Run", col_wrap=5,    subplot_kws=dict(projection='polar'), size=5, sharex=False, sharey=False, despine=False)

# Draw a scatterplot onto each axes in the grid
g.map(plt.plot, 'Rad', ''y axis label', marker=".", ms=3,   ls='None').set_titles("{col_name}")

plt.savefig('./image.pdf')

我的数据中包含以下内容:

enter image description here

我希望这个组织每行保留5个图。

问题是每个子图的标题与刻度的值重叠,对于y轴标签是相同的。

有没有办法防止这种行为?我可以以某种方式将标题略微移动到当前位置之上吗?我可以将y轴标签稍微移动到当前位置的左侧吗?

非常感谢提前!

修改 这不是此SO的重复,因为问题是一个子图的标题与 另一个 子图的轴标签重叠。

我的问题是,一个子图的标题与 相同的 子图的刻度标签重叠,同样轴标签与的刻度标签重叠相同的 子图。

我还想补充一点,我不在乎它们在我的jupyter笔记本上重叠(因为它是用它创建的),但我希望最终保存的图像没有重叠,所以也许我需要做些什么才能以稍微不同的格式保存图像以避免这种情况,但我不知道是什么(我只使用plt.savefig来保存它。)

编辑2:如果有人想重现这个问题,这是一个很小的例子:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

sns.set()
sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1.5)
# Generate an example radial datast
r = np.linspace(0, 10000, num=100)
df = pd.DataFrame({'label': r, 'slow': r, 'medium-slow': 1 * r, 'medium': 2 * r, 'medium-fast': 3 * r, 'fast': 4 * r})

# Convert the dataframe to long-form or "tidy" format
df = pd.melt(df, id_vars=['label'], var_name='speed', value_name='theta')

# Set up a grid of axes with a polar projection
g = sns.FacetGrid(df, col="speed", hue="speed",
                  subplot_kws=dict(projection='polar'), size=4.5, col_wrap=5,
                  sharex=False, sharey=False, despine=False)

# Draw a scatterplot onto each axes in the grid
g.map(plt.scatter, "theta", "label")

plt.savefig('./image.png')
plt.show()

这给出了以下图像,其中标题不像我原来的问题那么糟糕(但仍有一些重叠),左侧的标签完全重叠。enter image description here

2 个答案:

答案 0 :(得分:2)

为了将标题移动一点,你可以设置在新位置,

ax.title.set_position([.5, 1.1])

为了向左移动ylabel,可以添加一些填充

ax.yaxis.labelpad = 25

要为facetgrid的轴执行此操作,您需要:

for ax in g.axes:
    ax.title.set_position([.5, 1.1])
    ax.yaxis.labelpad = 25

答案 1 :(得分:1)

ImportanceOfBeingErnest在此SO question中提供的答案可能有所帮助。