请看下面的代码片段:
import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(1, 5760000)
plt.boxplot(data)
matplotlib绘制这个需要很长的时间和大量的内存。
我能做得更好吗?
我的一个想法是使用numpy计算最小值、最大值、中位数、第一四分位数和第三四分位数,然后,我可以将这些值直接给boxplot
,这样它就不必进行计算了。
这段代码运行速度非常快:
import numpy as np
data = np.random.rand(1, 5760000)
fq, median, tq = np.quantile(data, [0.25, 0.5, 0.75])
dmin, dmax = np.min(data), np.max(data)
但是,没有这样的选项(我可以看到)。
我的第二个想法是根据上面的统计数据手动绘制箱线图,但这需要我处理matplotlib艺术家的细节,如果可能的话,我希望避免这种情况。
我的第三个想法是用一种更简单的样式来绘制相关的箱线图数量,它看起来不像箱线图,但它传达了相同的信息。
现在我将使用第三个想法,但我希望有一种方法可以直接使用boxplot
。
2条答案
按热度按时间fafcakar1#
g2ieeal72#
第一个:
boxplot
对data = np.random.rand(1, 10)
的解释与data = np.random.rand(10, 1)
不同。第一个解释为10个箱形图的列表,每个箱形图由1个数据点创建,而第二个解释为1个箱形图的列表,每个箱形图有10个数据点。因此,传递
np.rand.rand(1, 5760000)
会在单个图表中绘制5760000
个单独的箱形图。这是非常耗时和内存的。实际上,您希望传递np.rand.rand(5760000, 1)
,因为您希望绘制一个包含约600万个数据点的数据集的统计量的箱形图。第二:下一页回答了如何手动将数据传递到箱线图绘制器函数:https://matplotlib.org/3.1.0/gallery/statistics/bxp.html