我想为每件事创建一个带有自定义标记的双小提琴图。到目前为止,我已经成功地创建了小提琴情节 然而,当我在顶部添加各种标记的分散时,它会破坏小提琴图的所有内容(您可以看到左侧小提琴图的阴影)。
我想知道如何将两者叠加。
我在下面包含了我的代码(通过注释掉所有 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 的内容,但它总是返回到此状态,但没有任何效果。
问题在于您设置刻度标签的方式。请注意,您的 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()
如您所见,通过在
positions
中正确设置小提琴的 width
和 ax3
,我们不必自己设置 x 轴标签,这些标签现在已设置为您想要的任何值。
因此,您的解决方案是定义您希望小提琴所处的位置,然后使用
positions
设置它们,然后再在顶部添加散点图。这可能是您当前所说的 centralised_frequencies
,但如果不查看完整代码,很难知道。