在小提琴图顶部添加散点图时,图会缩小到一边

问题描述 投票:0回答:1

我想为每件事创建一个带有自定义标记的双小提琴图。到目前为止,我已经成功地创建了小提琴情节 Violin Plots 然而,当我在顶部添加各种标记的分散时,它会破坏小提琴图的所有内容(您可以看到左侧小提琴图的阴影)。 Violin Plots with Scatter

我想知道如何将两者叠加。

我在下面包含了我的代码(通过注释掉所有 ax.scatter 线制作的小提琴图)

def plot_psd(centralised_frequencies,centralised_psds,distributed_frequencies,distributed_psds):
    fig,ax=plt.subplots(1,1,figsize=(10,5))
    
    add_label(ax.violinplot(centralised_psds,side='high',showmeans=False,showmedians=False,showextrema=False), "Centralised Control")
    ax.set_xticklabels(centralised_frequencies)
    add_label(ax.violinplot(distributed_psds,side='low',showmeans=False,showmedians=False,showextrema=False), "Distributed Control")
    ax.set_xticklabels(distributed_frequencies)
    ax.scatter(centralised_frequencies,np.mean(centralised_psds,1),marker=markers.CARETLEFTBASE,color='r')
    ax.scatter(centralised_frequencies,np.min(centralised_psds,1),marker=markers.TICKLEFT,color='r')
    ax.scatter(centralised_frequencies,np.max(centralised_psds,1),marker=markers.TICKLEFT,color='r')
    ax.scatter(distributed_frequencies,np.mean(distributed_psds,1),marker=markers.CARETRIGHTBASE,color='b')
    ax.scatter(distributed_frequencies,np.min(distributed_psds,1),marker=markers.TICKRIGHT,color='b')
    ax.scatter(distributed_frequencies,np.max(distributed_psds,1),marker=markers.TICKRIGHT,color='b')
    
    ax.legend(*zip(*labels))
    ax.set_xlabel("Frequency (Hz)")
    ax.set_ylabel("PSD*Freq")
    ax.set_xlabel("Frequency (Hz)")
    ax.set_ylabel("PSD*Freq")
    ax.set_title("Centralised Control")
    ax.set_title("Distributed Control")
    fig.savefig("6_Results/clean_data/psd.png")
    plt.clf()
    plt.close()

我已经尝试多次更改 x-ticker 和 axis 的内容,但它总是返回到此状态,但没有任何效果。

python matplotlib plot scatter-plot violin-plot
1个回答
0
投票

问题在于您设置刻度标签的方式。请注意,您的 x 轴标签全部乱序。

当您使用

ax.set_xticklabels()
更改 x 轴上的值时,您已将 x 轴刻度与其标签解耦。

默认情况下,

ax.violinplot
会自动选择小提琴的x位置为整数值(1、2、3等),默认小提琴宽度为0.5。

然后,您将这些刻度的标签更改为一些新值,但轴上的基础位置不知道这些标签是什么。

因此,当您稍后使用散点图时,它会绘制轴的实际值,并且您的小提琴会被分流到左侧。

考虑这个最小的例子,它显示了绘制小提琴的 3 种方法

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)
data = [sorted(np.random.normal(0, std, 100)) for std in range(1, 5)]

fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(15, 5))

ax1.violinplot(data)
ax1.set_title('default labels')

ax2.violinplot(data)
ax2.set_xticklabels([100, 200, 300, 400, 500])
ax2.set_title('decoupled labels')

ax3.violinplot(data, positions=[50, 60, 70, 80], widths=5)
ax3.set_title('correctly modified labels')

plt.show()

a plot showing 3 different ways of setting the x axis labels on violinplots from matplotlib

如您所见,通过在

positions
中正确设置小提琴的
width
ax3
,我们不必自己设置 x 轴标签,这些标签现在已设置为您想要的任何值。

因此,您的解决方案是定义您希望小提琴所处的位置,然后使用

positions
设置它们,然后再在顶部添加散点图。这可能是您当前所说的
centralised_frequencies
,但如果不查看完整代码,很难知道。

© www.soinside.com 2019 - 2024. All rights reserved.