如何在plotly python中将箱形图中位数与多类别x轴连接起来

Posted

技术标签:

【中文标题】如何在plotly python中将箱形图中位数与多类别x轴连接起来【英文标题】:How to connect box plot medians with multicategory x axis in plotly python 【发布时间】:2021-12-25 17:55:25 【问题描述】:

我正在尝试绘制此图,但在 *** 或 plotly 论坛中找不到任何示例。 我把plotly js的例子放在这里是为了更好的复现代码。但是我需要的真正解决方案在plotly python

提前感谢您提供此问题的指南或解决方案。

一些研究,但我有多分类 x 轴!

Shiny: How to add a median line on a box plot using Plotly?

Plotly: How to add a median line on a box plot

这是我使用的代码。当然修改了一点来代表我想要的实际情节。 https://plotly.com/javascript/axes/

var trace1 = 
  x: [
    
    ['giraffes', 'orangutans', 'monkeys','giraffes', 'orangutans', 'monkeys'],
    ['SF Zoo','SF Zoo','SF Zoo','SF Zoo','SF Zoo','SF Zoo']
  ],
  y: [5, 14, 23,12,13,14],
   boxpoints: 'all',
  name: 'SF Zoo',
  type: 'box',
  boxmean:true

;

var trace2 = 
  x: [
     ['giraffes', 'orangutans', 'monkeys','giraffes', 'orangutans', 'monkeys','monkeys','giraffes'],
    ['LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo']
  ],
  y: [12, 18, 29,22,11,19,12,26],
  //name: 'LA Zoo',
  type: 'box',
  boxmean:true,
  name: 'LA Zoo',

  boxpoints: 'all'
  
;

var x= [
    ['LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo'],
    ['giraffes', 'orangutans', 'monkeys','giraffes', 'orangutans', 'monkeys','monkeys','giraffes']
  ];

var y = [12, 18, 29,22,11,19,12,26];

var connecting_means = [
  type: 'scatter',
  x: x,
  y: y,
  //mode: 'line',
  transforms: [
    type: 'aggregate',
    groups: x,
    aggregations: [
      target: 'y', func: 'mean', enabled: true]]
];

var data = [trace1, trace2,connecting_means];
var layout = 
  showlegend: true,
  xaxis: 
    tickson: "boundaries",
    ticklen: 15,
    showdividers: true,
    dividercolor: 'grey',
    dividerwidth: 3
  
;


Plotly.newPlot('myDiv', data, layout,connecting_means);
<head>
    <!-- Load plotly.js into the DOM -->
    <script src='https://cdn.plot.ly/plotly-2.4.2.min.js'></script>
</head>

<body>
    <div id='myDiv'><!-- Plotly chart will be drawn inside this DIV --></div>
</body>

【问题讨论】:

据我所知,我们没有这个功能,那么如何对线条进行注释 @r-beginners 你是 plotly 的开发者之一吗?注释行是什么意思? 不,我不参与plotly的开发。 @r-beginners 如果是这样,你为什么说“我们没有那个功能”? 我可能选错词了。我的意思是我没有看到任何示例或功能 【参考方案1】:

正如@r-beginners 评论的那样,Plotly 无法提取箱线图统计数据(例如中位数或四分位数)。因此,您将需要手动计算每个框的中位数,并在框之间画线作为迹线。

这是 Plotly.js 中的一个解决方案,我们为每个单独的箱线图创建数组,使用 @JBallin 编写的 median function 找到它们的中值,并使用额外的轨迹连接它们。我对您的数据进行了一些重组,并使用循环连接每个类别中的框。你可以找到codepenhere。

var giraffe_sf = [5,12]
var giraffe_la = [12,22,26]
var orang_sf = [13,14]
var orang_la = [18,11]
var monkeys_sf = [14,24]
var monkeys_la = [29,19,12]

sf_y = giraffe_sf.concat(orang_sf, monkeys_sf)
la_y = giraffe_la.concat(orang_la, monkeys_la)

var categories = ['giraffes', 'orangutans', 'monkeys']
var all_data = [[giraffe_sf, giraffe_la], [orang_sf, orang_la], [monkeys_sf, monkeys_la]]

function median(numbers) 
    const sorted = numbers.slice().sort((a, b) => a - b);
    const middle = Math.floor(sorted.length / 2);

    if (sorted.length % 2 === 0) 
        return (sorted[middle - 1] + sorted[middle]) / 2;
    

    return sorted[middle];


// sort the arrays
var trace1 = 
  x: [
    ['giraffes', 'giraffes', 'orangutans', 'orangutans', 'monkeys', 'monkeys'],
    ['SF Zoo','SF Zoo','SF Zoo','SF Zoo','SF Zoo','SF Zoo']
  ],
  y: sf_y,
   boxpoints: 'all',
  name: 'SF Zoo',
  type: 'box',
  boxmean:true

;

var trace2 = 
  x: [
     ['giraffes', 'giraffes', 'giraffes', 'orangutans', 'orangutans', 'monkeys','monkeys', 'monkeys'],
    ['LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo','LA Zoo']
  ],
  y: la_y,
  type: 'box',
  boxmean:true,
  name: 'LA Zoo',
  boxpoints: 'all'
;

var data = [trace1, trace2];

for (let i = 0; i < categories.length; i++) 
  trace = 
    x: [
      [categories[i], categories[i]],
      ['SF Zoo','LA Zoo']
    ],
    y: [median(all_data[i][0]),median(all_data[i][1])],
    mode: 'lines',
    type: 'scatter',
    marker: color: 'black',
    showlegend: false
  
  data.push(trace)
;

var layout = 
  showlegend: true,
  xaxis: 
    tickson: "boundaries",
    ticklen: 15,
    showdividers: true,
    dividercolor: 'grey',
    dividerwidth: 3
  
;

Plotly.newPlot('myDiv', data, layout);

【讨论】:

谢谢德里克。我认为将其转换为 ploly python 应该是直截了当的。我认为中值函数也已经内置在 python 中。 哦,那是我的错误:我没有仔细阅读您的问题,并认为您在 plotly.js 中需要它,但在 plotly-python 中确实有几个不同的包具有中位数,因此解决方案应该是很相似

以上是关于如何在plotly python中将箱形图中位数与多类别x轴连接起来的主要内容,如果未能解决你的问题,请参考以下文章

Python数据可视化 箱线图

R数据可视化2:箱形图 Boxplot

在python的箱形图中显示平均值?

Python Matplotlib 在条形图中绘制样本均值,具有置信区间,但看起来像箱形图

可视化神器Plotly玩转箱形图

如何更改熊猫箱形图中胡须的线型?