手动绘图箱线图(不是来自数据)

Manual plotly boxplot (not from data)

据我所知,一个 plotly boxplot(至少是默认版本,应该等同于普遍接受的 boxplot 表示)由 5 个值定义:

q(0.0)    # The smallest outlier (= bottom whisker)
q(0.25)   # The first quartile (= bottom box base y-value)
q(0.5)    # The median (= horizontal line inside the box)
q(0.75)   # The third quartile (= top box base y-value)
q(1.0)    # The largest outlier (= top whisker)

这些是我认为在绘制箱线图时 plotly 应该计算的数字。

我在 server 上设置了一个数据集,其中包含太多(并且不断增加)的数字,我想在 client 上使用箱线图(多个数据集 ->实际上是多个箱线图,但与这个问题的上下文无关)。我认为最好的方法是在服务器上使用特殊技巧预先计算那些定义数字,他们喜欢称之为 five-number summary,然后简单地将摘要传递给客户端,这样可以轻松绘制箱线图,每次处理可视化请求时,我都不必阻塞带宽,也不必让客户端进行计算工作。我希望我可以在 js.

中使用 plotly 来做到这一点

Plotly 很棒而且它(联合国?)幸运地与我的项目紧密集成,所以我想避免用另一个 vis 工具替换它。

尽管如此,据我所知,plotly boxplot 绘图函数接受一个 list of data (这是预期的用例),并没有真正让用户使用自己的允许对 boxplot 可视化进行低级别访问的预先计算的摘要。我以为我可以轻松绕过这个,因为 for

list_of_data = [A, B, C, D, E]

其中 ABCDE 是五数摘要的任意排列,箱线图应由摘要准确确定。然而,我发现情况并非如此。由于我未知(且无法想象)的原因,Plotly 根本不会以这种方式处理 list of data,所以我不知道如何开始解决这个问题。

最终,我想知道的是,我如何制作一个人工的小型数据集(不必在 python ofc 中,我只需要算法)

def dataset_for_js_plotly(five_number_summary):
    ...

这导致 plotly 精确绘制与摘要对应的箱线图,或者如果确实 一种手动指定箱线图在 js plotly,我错过了。

我找到了解决方案 here。先前已请求对箱线图计算进行低级访问 - 对于奇数个元素,有多种方法可以计算 Q1(镜像 Q3)。它们如下(对伪蟒蛇感到抱歉)。

独占方式:

def get_Q1_exclusive(data):
    N = len(data)
    data_l1 = get_lowest(data, N//2 - 1)
    return median(data_l1)

包容方式:

def get_Q1_inclusive(data):
    N = len(data)
    data_l2 = get_lowest(data, N//2)
    return median(data_l2)

线性方法(由于某些原因默认使用):

def get_Q1_linear(data):
    l1 = get_Q1_inclusive(data)
    l2 = get_Q1_exclusive(data)
    return (l1 + l2) / 2

幸运的是,可以通过向 data 参数添加一个名为 quartilemethod:

的指令来更改默认方法
Plotly.newPlot( ..., 
[
    {
        y: [2, 4, 5, 10, 11, 11, 11],
        type: 'box',
        quartilemethod: "inclusive" // or "exclusive" or "linear" (default)
    }
],
...
)

因此,问题的总体解决方案是保持原始输入数组不变,指定 minQ1medQ3max,同时使用 inclusive 方法进行 Q1/Q3 计算。它适用于我的代码,变化很小,问题已解决。

根据方框轨迹reference:

The second signature expects users to supply the boxes corresponding Q1, median and Q3 statistics in the q1, median and q3 data arrays respectively.

使用这个二次签名时,也可以直接指定mean、std、lowerfence、upperfence等其他统计信息

例如,

var data = [
  {
    q1: [3, 1],
    median: [4, 2],
    q3: [5, 3],
    mean: [4.5, 2.5],
    sd: [1, 1],
    lowerfence: [0.5, 0.5],
    upperfence: [9, 8],
    type: 'box'
  }
];

Plotly.newPlot('myDiv', data);