pythonplotlygraph_objects框标记的属性outliercolor不起作用(可能是错误)

2024-02-11

我想我在类plotly.graph_objects.box Marker中发现了一个错误,因为属性outliercolor不起作用。我按照参考文献https://plotly.github.io/plotly.py-docs/ generated/plotly.graph_objects.Box.html#plotly.graph_objects.box.Marker.outliercolor https://plotly.github.io/plotly.py-docs/generated/plotly.graph_objects.Box.html#plotly.graph_objects.box.Marker.outliercolor,但改变异常值颜色不会产生任何影响。

这是一个例子:

import numpy as np
import pandas as pd
import plotly.graph_objects as go
from matplotlib.colors import LinearSegmentedColormap, to_hex

df_plot = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
cat_var = "species"
num_var = "petal_length"

lvls = df_plot[cat_var].unique()
n_levels = len(lvls)
cmap = LinearSegmentedColormap.from_list("my_palette", ["#111539", "#97A1D9"])
my_palette = [to_hex(j) for j in  [cmap(i/n_levels) for i in np.array(range(n_levels))]]

boxes = []
for l in range(n_levels):
    boxes += [
        go.Box(
            name = lvls[l],
            y = df_plot.loc[df_plot.loc[:, cat_var] == lvls[l], num_var].values,
            width = 0.4,
            boxpoints = "outliers",
            marker = {
                "outliercolor": "red", ### there may be a plotly.go bug here
                "color": my_palette[l],
                "size": 30,
                "opacity": 0.5
            }
        )
    ]
fig = go.Figure(data = boxes)
fig.update_layout(
    font = dict(
        size = 18
    ),
    showlegend = False,
    plot_bgcolor = "white",
    hoverlabel = dict(
        font_size = 18,
        font_family = "Rockwell"
    )
)
fig.show()


这确实是 Plotly 中的一个错误 - 可以将其作为错误报告提交给 Plotly 团队。

值得注意的是修改boxpoints = "outliers" to boxpoints = "suspectedoutliers"产生不同颜色的标记,以便suspectedoutliers行为符合预期。但是,您不能使用suspectedoutliers代替outliers因为可疑的异常值只是所有异常值的子集。

您可以通过手动绘制离群值来实现所需的行为。为此,您仍然需要设置boxpoints=outliers,然后将异常值绘制为单独的散点,并在 Plotly 生成的异常值上使用所需的颜色。

这有点密集,因为这需要重写算法来确定异常值exactly当 Plotly 库执行此计算时。不幸的是,您无法以任何方式从 go.Box 或 Plotly 中提取 Q1、Q3 或其他统计数据因为这些计算是在图形渲染时由 Javascript 在后台执行的 https://community.plotly.com/t/extracting-box-plot-statistics/37383.

首先要注意的是,不同 Python 库之间计算 Q1 和 Q3 是不同的:Plotly 在文档 https://plotly.com/python/box-plots/#choosing-the-algorithm-for-computing-quartiles,解释说他们使用这篇短文中的方法 #10 http://jse.amstat.org/v14n3/langford.html计算百分位数。

在 Python 中,使用方法 #10(线性插值)计算百分位数的函数如下所示:

## calculate quartiles as outlined in the plotly documentation 
def get_percentile(data, p):
    data.sort()
    n = len(data)
    x = n*p + 0.5
    x1, x2 = floor(x), ceil(x)
    y1, y2 = data[x1-1], data[x2-1] # account for zero-indexing
    return y1 + ((x - x1) / (x2 - x1))*(y2 - y1)

现在,要从数据集中提取离群值,您可以对数据进行子集化:低于 (Q1 - 1.5 * IQR) 或高于 (Q3 + 1.5 * IQR) 的任何值,其中 IQR = Q3 - Q1 被视为离群值。

把这一切放在一起:

from math import floor, ceil
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from matplotlib.colors import LinearSegmentedColormap, to_hex

df_plot = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
cat_var = "species"
num_var = "petal_length"

lvls = df_plot[cat_var].unique()
n_levels = len(lvls)
cmap = LinearSegmentedColormap.from_list("my_palette", ["#111539", "#97A1D9"])
my_palette = [to_hex(j) for j in  [cmap(i/n_levels) for i in np.array(range(n_levels))]]

## calculate quartiles as outlined in the plotly documentation 
def get_percentile(data, p):
    data.sort()
    n = len(data)
    x = n*p + 0.5
    x1, x2 = floor(n*p), ceil(n*p)
    y1, y2 = data[x1-1], data[x2-1] # account for zero-indexing
    return y1 + ((x - x1) / (x2 - x1))*(y2 - y1)

def get_fences(data):
    q1, q3 = get_percentile(data, 0.25), get_percentile(data, 0.75)
    iqr = q3-q1
    return (q1 - (1.5*iqr), q3 + (1.5*iqr))

boxes = []
for l in range(n_levels):
    data = df_plot.loc[df_plot.loc[:, cat_var] == lvls[l], num_var].values
    outliers = data[(data < get_fences(data)[0]) | (data > get_fences(data)[1])]
    print(outliers)
    boxes += [
        go.Box(
            name = lvls[l],
            y = data,
            width = 0.4,
            boxpoints = "outliers",
            marker = {
                "outliercolor": "red", ### there may be a plotly.go bug here
                "color": my_palette[l],
                "size": 30,
                "opacity": 0.5
            }
        ),
        go.Scatter(
            x = [lvls[l]]*len("outliers"),
            y = outliers,
            mode = 'markers',
            marker=dict(color="red", size=28, opacity=0.5)
        )
    ]
fig = go.Figure(data = boxes)
fig.update_layout(
    font = dict(
        size = 18
    ),
    showlegend = False,
    plot_bgcolor = "white",
    hoverlabel = dict(
        font_size = 18,
        font_family = "Rockwell"
    )
)
fig.show()

作为检查我们工作的一种方式,您会注意到手动添加的稍小的离群值与 Plotly 确定的离群值相匹配。 (您可以使手动添加的离群值更大,以掩盖 Plotly 生成的非所需颜色的离群值)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pythonplotlygraph_objects框标记的属性outliercolor不起作用(可能是错误) 的相关文章

  • 使用 pip 或 conda 来管理包? [复制]

    这个问题在这里已经有答案了 我已经使用 matlab 进行机器学习很长一段时间了 最 近切换到 python 并使用其包管理器 pip 安装某些包并成功安装了许多包 几天前 我开始使用 conda 我以前安装的所有软件包都被覆盖 我真的很想
  • 查找公因数以将浮点数列表转换为整数列表

    我有一个来自其他函数的浮点数列表 我所知道的是 在理想世界中存在一个共同因素 可用于将每一项相乘以获得整数列表 可能存在一些小的数值噪声 1e 14 例如 2 3333333333333335 4 666666666666667 1 0 1
  • 将 Django Model 对象转换为 dict,所有字段都完好无损

    如何将 django Model 对象转换为 dictall它的领域 理想情况下 所有内容都包含外键和 editable False 的字段 让我详细说明一下 假设我有一个如下所示的 django 模型 from django db imp
  • 使用 pycharm 进行交互式 shell 调试

    我是 PyCharm 新手 我已经使用 IDLE 很长时间了 在IDLE中执行脚本后使用Python对象非常方便 有没有办法在使用 PyCharm 与交互式 python shell 执行后使用脚本对象 例如 我们有一个 测试 项目 其中包
  • 使用 Python pdb 检查未处理异常原因的最简单方法是什么?

    我刚刚将所有单元测试数据从 JSON 转换为 YAML 现在代码中的某处引发了异常 更具体地说 这是打印的回溯 Traceback most recent call last File tests test addrtools py lin
  • 使用组合时如何解决循环依赖?

    我遇到了如下所示的情况 其中每个类都需要另一个类 并且它创建了循环依赖关系 我在使用 ctypes 包装一些 C 代码时遇到了这种情况 已经有很多关于这个主题的帖子 但我发现它们没有帮助 我需要一些例子 Module A from B im
  • 为不带引号的函数获取字符串参数

    我有一个函数 用于从 URL 下载文件并将其写入磁盘 并施加特定的文件扩展名 目前 它看起来像这样 import requests import os def getpml url filename psc requests get url
  • ValueError:无法将 DatetimeIndex 转换为 dtype datetime64[us]

    我正在尝试为 S P 500 ETF 创建一个包含 30 分钟数据的 PostgreSQL 表 spy30new 用于测试新插入的数据 来自具有 15 分钟数据的多个股票的表 全部 15 个 all15 在 dt 时间戳 和 instr 股
  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这
  • Jupyter Notebook 找不到 IQSharp

    我一直在尝试为 Quantum Katas 运行 Q 但在找到 Q 内核方面遇到了一些困难 唯一显示的内核是用于 Jupyter Notebook 的 Python 3 内核 奇怪的是 当我执行 jupyter kernalspec lis
  • 使用 isdigit 表示浮点数?

    a raw input How much is 1 share in that company while not a isdigit print You need to write a number n a raw input How m
  • Dataframe unstack 性能 - pandas

    我正在尝试拆开数据框 它工作正常 但问题是我正在处理 CSV 文件中的巨大数据集 约 10 亿 这是示例数据集 236539 48512569874 Name Danny 236539 48512569874 Class 12 236539
  • pyqt4窗口调整大小事件

    我正在使用 python3 和 pyqt4 我希望每次运行时都会运行一些代码QMainWindow已调整大小 我想要这样的东西 self window resized connect self resize but resized不是内置函
  • 使用 selenium 和 firefox 保存图像

    我正在尝试使用 selenium 服务器和 python 客户端从网站保存图像 我知道图像的 URL 但我无法找到保存它的代码 无论是当它是文档本身还是当它嵌入到当前浏览器会话中时 到目前为止我找到的解决方法是保存页面的屏幕截图 有两种硒方
  • 使用 python 更改目录

    我碰巧发现我无法从 python 代码中更改实际目录 我的测试程序如下 from os import system def sh script system bash c s script sh cd home sh pwd 的输出pwd
  • 为什么Python安装程序不断弹出?

    每当我尝试运行 Python 文件时 都会自动弹出此窗口 虽然 我可以关闭它 但有时它会连续打开 7 10 个窗口 这令人恼火 谁能告诉我为什么会发生这种情况 None
  • 适用于 Python 的 GitLab CI 共享 Windows 运行器

    我在 GitLab 中有一个 python 项目仓库 我看到 GitLab 共享了可用的测试版 Windows 运行程序 请参阅this https about gitlab com blog 2020 01 21 windows shar
  • 如何使用Python3.4在tornado中进行异步mysql操作?

    我现在使用Python3 4 我想在Tornado中使用异步mysql客户端 我已经发现torndb https github com bdarnell torndb但在阅读其源代码后 我认为它无法进行异步mysql操作 因为它只是封装了M
  • 将 pi 打印到小数点后几位

    w3resources 面临的挑战之一是将 pi 打印到小数点后 n 位 这是我的代码 from math import pi fraser str pi length of pi number of places raw input En
  • 加入语音频道(discord.py)

    当我尝试让我的机器人加入我的语音频道时 出现以下错误 await client join voice channel voice channel 产生错误的行 Traceback most recent call last File usr

随机推荐