很抱歉,如果已经存在一个可以回答这个问题的问题;我找不到它。
我希望为数据集制作小提琴图。对于该集合中的每个元素,我都有直方图值(bin和频率),但没有产生该直方图的数据。
在这种情况下,是否可以使用Matplotlib或Seaborn的小提琴功能?据我所知,输入应该是未合并的数据,而不是合并的数据。
我想写一个自定义的violinplot函数是可能的,但是我想知道在现有框架中是否有一种更快,更干净的方法。谢谢!
答案 0 :(得分:0)
您可以简单地从直方图数据中创建样本值。这可以通过对每个仓进行随机均匀采样来实现,其中采样数是通过频率来控制的。然后,这些样本可以作为小提琴图的输入。如果箱数很少,则三角形分布可能会给出更好的图。如果频率较低,则可能需要将它们相乘以获得更多样本。
以下是一些示例代码,用于比较“真实”和“模拟”小提琴图:
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns
x0 = np.random.normal(np.repeat(np.random.uniform(10, 20, 10), 100), 1)
fig, axes = plt.subplots(ncols=3, figsize=(15, 3))
sns.violinplot(x0, ax=axes[0])
axes[0].set_title('violin plot from original data')
frequencies, bin_edges = np.histogram(x0)
axes[1].bar(bin_edges[:-1], frequencies, width=np.diff(bin_edges), ec='w', lw=1, align='edge')
axes[1].set_title('histogram')
x1 = np.random.uniform(np.repeat(bin_edges[:-1], frequencies), np.repeat(bin_edges[1:], frequencies))
sns.violinplot(x1, ax=axes[2])
axes[2].set_title('violin plot from simulated data')
plt.tight_layout()
plt.show()
这里是一个实验,显示将模拟结果用作下一个模拟的输入时会发生的情况。每一步都会使形状变平。由于重塑的过程很缓慢,因此每20 th 步骤都只能显示一次。
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns
x0 = np.random.normal(np.repeat(np.random.uniform(10, 20, 7), 100), 1)
xs = []
for i in range(101):
if i % 20 == 0:
xs.append(np.copy(x0))
frequencies, bin_edges = np.histogram(x0)
x0 = np.random.uniform(np.repeat(bin_edges[:-1], frequencies), np.repeat(bin_edges[1:], frequencies))
sns.violinplot(x=np.repeat(np.arange(len(xs)) * 20, len(xs[0])), y=np.ravel(xs), color='turquoise')
plt.tight_layout()
plt.show()