Python, Seaborn: Logarithmic Swarmplot 在群体中有意想不到的间隙
Python, Seaborn: Logarithmic Swarmplot has unexpected gaps in the swarm
让我们看一个 swarmplot,使用 Python 3.5 和 Seaborn 基于一些数据(存储在 pandas 数据帧 df 中,列标签存储在另一个 class 中。这暂时无所谓,直接看剧情):
ax = sns.swarmplot(x=self.dte.label_temperature, y=self.dte.label_current, hue=self.dte.label_voltage, data = df)
现在,如果在 y 轴上以对数刻度绘制数据,则数据更具可读性,因为它已经过了几十年。
因此,让我们将缩放比例更改为对数:
ax.set_yscale("log")
ax.set_ylim(bottom = 5*10**-10)
好吧,我对群中的间隙有疑问。我猜他们在那里是因为当绘图是在考虑线性轴的情况下创建的并且点不应该在那里重叠时他们就在那里。但现在它们看起来有点奇怪,并且有足够的 space 来组成 4 个看起来相同的群体。
我的问题是:如何强制 seaborn
重新计算点的位置以创建更好看的群?
mwaskom 在评论中向我暗示了如何解决这个问题。
它甚至在沼泽地 doku:
中有说明
Note that arranging the points properly requires an accurate transformation between data and point coordinates. This means that non-default axis limits should be set before drawing the swarm plot.
将现有轴设置为对数刻度并将其用于绘图:
fig = plt.figure() # create figure
rect = 0,0,1,1 # create an rectangle for the new axis
log_ax = fig.add_axes(rect) # create a new axis (or use an existing one)
log_ax.set_yscale("log") # log first
sns.swarmplot(x=self.dte.label_temperature, y=self.dte.label_current, hue=self.dte.label_voltage, data = df, ax = log_ax)
这会产生正确且所需的绘图行为:
让我们看一个 swarmplot,使用 Python 3.5 和 Seaborn 基于一些数据(存储在 pandas 数据帧 df 中,列标签存储在另一个 class 中。这暂时无所谓,直接看剧情):
ax = sns.swarmplot(x=self.dte.label_temperature, y=self.dte.label_current, hue=self.dte.label_voltage, data = df)
现在,如果在 y 轴上以对数刻度绘制数据,则数据更具可读性,因为它已经过了几十年。 因此,让我们将缩放比例更改为对数:
ax.set_yscale("log")
ax.set_ylim(bottom = 5*10**-10)
好吧,我对群中的间隙有疑问。我猜他们在那里是因为当绘图是在考虑线性轴的情况下创建的并且点不应该在那里重叠时他们就在那里。但现在它们看起来有点奇怪,并且有足够的 space 来组成 4 个看起来相同的群体。
我的问题是:如何强制 seaborn
重新计算点的位置以创建更好看的群?
mwaskom 在评论中向我暗示了如何解决这个问题。 它甚至在沼泽地 doku:
中有说明Note that arranging the points properly requires an accurate transformation between data and point coordinates. This means that non-default axis limits should be set before drawing the swarm plot.
将现有轴设置为对数刻度并将其用于绘图:
fig = plt.figure() # create figure
rect = 0,0,1,1 # create an rectangle for the new axis
log_ax = fig.add_axes(rect) # create a new axis (or use an existing one)
log_ax.set_yscale("log") # log first
sns.swarmplot(x=self.dte.label_temperature, y=self.dte.label_current, hue=self.dte.label_voltage, data = df, ax = log_ax)
这会产生正确且所需的绘图行为: