绘制箱线图时如何处理 NaN 值

2024-02-10

我正在使用 matplotlib 绘制框图,但有一些缺失值 (NaN)。然后我发现它不显示具有 NaN 值的列内的方框图。 你知道如何解决这个问题吗? 这是代码。

import numpy as np
import matplotlib.pyplot as plt

#==============================================================================
# open data
#==============================================================================
filename='C:\\Users\\liren\\OneDrive\\Data\\DATA in the first field-final\\ks.csv'

AllData=np.genfromtxt(filename,delimiter=";",skip_header=0,dtype='str')

TreatmentCode = AllData[1:,0]
RepCode = AllData[1:,1]
KsData= AllData[1:,2:].astype('float')
DepthHeader = AllData[0,2:].astype('float')
TreatmentUnique = np.unique(TreatmentCode)[[3,1,4,2,8,6,9,7,0,5,10],]
nT = TreatmentUnique.size#nT=number of treatments
#nD=number of deepth;nR=numbers of replications;nT=number of treatments;iT=iterms of treatments
nD = 5
nR = 6
KsData_3D = np.zeros((nT,nD,nR)) 

for iT in range(nT):
    Treatment = TreatmentUnique[iT]

    TreatmentFilter = TreatmentCode == Treatment

    KsData_Filtered = KsData[TreatmentFilter,:]
    
    KsData_3D[iT,:,:] = KsData_Filtered.transpose()iD = 4
                      
fig=plt.figure()
ax = fig.add_subplot(111)
plt.boxplot(KsData_3D[:,iD,:].transpose())
ax.set_xticks(range(1,nT+1))
ax.set_xticklabels(TreatmentUnique)
ax.set_title(DepthHeader[iD])

这是最终的数字,盒子里缺少一些治疗方法。


您可以删除NaN首先从数据中提取 s,然后绘制过滤后的数据。

为此,您可以首先找到NaNs using np.isnan(data) https://docs.scipy.org/doc/numpy/reference/generated/numpy.isnan.html,然后使用该布尔数组执行按位反转~:按位取反运算符 https://docs.python.org/3/library/operator.html#mapping-operators-to-functions。用它来索引数据数组,然后过滤掉NaNs.

filtered_data = data[~np.isnan(data)]

在一个完整的例子中(改编自here https://matplotlib.org/stable/gallery/pyplots/boxplot_demo_pyplot.html)

测试于python 3.10, matplotlib 3.5.1, seaborn 0.11.2, numpy 1.21.5, pandas 1.4.2

对于一维数据:

import matplotlib.pyplot as plt
import numpy as np

# fake up some data
np.random.seed(2022)  # so the same data is created each time
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, flier_high, flier_low), 0)

# Add a NaN
data[40] = np.NaN

# Filter data using np.isnan
filtered_data = data[~np.isnan(data)]

# basic plot
plt.boxplot(filtered_data)

plt.show()

对于二维数据:

对于 2D 数据,不能简单地使用上面的掩码,因为这样数据数组的每一列都会有不同的长度。相反,我们可以创建一个列表,列表中的每一项都是数据数组每列的过滤数据。

列表理解可以在一行中完成此操作:[d[m] for d, m in zip(data.T, mask.T)]

import matplotlib.pyplot as plt
import numpy as np

# fake up some data
np.random.seed(2022)  # so the same data is created each time
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, flier_high, flier_low), 0)

data = np.column_stack((data, data * 2., data + 20.))

# Add a NaN
data[30, 0] = np.NaN
data[20, 1] = np.NaN

# Filter data using np.isnan
mask = ~np.isnan(data)
filtered_data = [d[m] for d, m in zip(data.T, mask.T)]

# basic plot
plt.boxplot(filtered_data)

plt.show()

我将把它作为练习留给读者,将其扩展到 3 个或更多维度,但您已经明白了。


上面的解决方案是如何使用matplotlib独自的。其他替代方案(使用matplotlib在引擎盖下)都可以使用内置此行为,因此无需自己过滤数据。

  1. Use seaborn,这是一个高级 APImatplotlib. seaborn.boxplot https://seaborn.pydata.org/generated/seaborn.boxplot.html过滤器NaN在引擎盖下。
import seaborn as sns

sns.boxplot(data=data)

1D

2D


  1. Use pandas. NaN如果从以下位置绘制也会被忽略df.plot(kind='box') https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html for pandas,它使用matplotlib作为默认的绘图后端。
import pandas as pd

df = pd.DataFrame(data)

df.plot(kind='box')

1D

2D

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

绘制箱线图时如何处理 NaN 值 的相关文章

随机推荐

  • 使用 ggplot2 更改时间序列上的 x 刻度数

    我正在尝试绘制时间序列x output看起来像这样 timestamp city wait time weekday time 2015 07 14 09 00 00 Boston 1 6 Tuesday 09 00 00 2015 07
  • 通过引用传递变量是否已被弃用?

    有一个comment https stackoverflow com questions 879 php variables passed by value or by reference comments 574631 on an ans
  • NuGet 包丢失

    我搜索了这个问题 但没有一个解决方案有效 我安装了 Visual Studio Professional 2015 并且正在使用 TFS 我的NuGet版本是3 1 6 此问题仅发生在我的 C Web API MVC 项目中 我收到以下错误
  • 如何获取今天到目前为止经过的毫秒数

    我想获取当前时间和日期 以毫秒为单位 我怎样才能得到这个 我试过这个 Date date new Date System out println Today is date getTime 它将返回 1970 年 1 月 1 日以来的毫秒数
  • 将一种样式类指向另一种样式类?

    我有一个 css 类 例如 foo background color red 然后我为列表指定了一个类 list1 li background color tan 是否可以将一个样式类设置为仅指向另一个样式类 就像是 list1 li fo
  • 设置详细/自定义错误消息问题,iis 7 asp classic

    我在任何地方都找不到类似的问题 基本上 当我将网站设置为自定义错误时 它会显示默认的 500 错误消息 但是当我将其设置为显示详细错误时 页面加载正常 不会出现错误 还有其他人遇到过这个吗 我怎样才能看到错误是什么 IN IIS 打开IIS
  • 设置 xdebug 会话 cookie 时停止 chrome 的解决方法?

    这个情况有点具体 不知道有没有人遇到过以下情况 设置 xdebug 会话 cookie 后 Chrome 开始停止 cookie 可能是之前调试留下的 当不使用调试时 所有请求 ajax 或 正常 都会变慢 开始接收前 15 秒到 2 分钟
  • 如何使用 React Router 6 进行 404 重定向? [复制]

    这个问题在这里已经有答案了 在 React Router 5 中我可以使用
  • 如何按照约定首先删除代码中外键字段的下划线

    我的项目中有多个课程 包括 TPT 每个 POCO 都有一个BaseClass 其中有一个GUID 称为GlobalKey 作为主键 首先我用的是DataAnnotations创建正确的外键 但随后我在将相应的 GUID 与对象本身同步时遇
  • PHP 7.2 CURLFile 给出“无效文件名”警告

    我在使用 CURLFile 对象时遇到问题 curl file create 我尝试了多种方法 但无论我尝试什么 我最终都会在日志文件中收到 PHP 警告 并且该文件在我的 cURL 调用中被忽略 首先 一些信息 PHP 7 2 文件已确认
  • 每次查询后重新打开sqlite数据库的效率

    我目前正在龙卷风中的网络服务器上工作 但在尝试同时访问数据库的不同代码位时遇到问题 我通过简单地使用一个查询函数来简化这一点 该函数基本上可以执行此操作 但稍微更高级 def query command arguments db sqlit
  • 有没有办法在延迟运算符之后“取消”流

    我在使用 NgRx 的 Angular 应用程序中使用轮询方案 为了简化事情 我有如下内容 public stopPolling createEffect gt this actions pipe ofType actions stopPo
  • 有没有办法使用Python openpyxl从excel读取持续时间类型字段?

    我正在尝试从 Excel 文件读取持续时间字段 但我得到的是日期时间类型 而不是 timedelta 类型 因此 当持续时间值超过 24 小时时 python openpyxl 无法正确读取该字段 有没有使用 Python openpyxl
  • Yii2如何向外部url发送表单请求

    如何向外部 URL 发送重定向 POST 请求 我在控制器中的代码 if model gt load Yii app gt request gt post model gt validate send post request to ext
  • 如何延迟分配归零内存?

    据我了解 我必须做出选择calloc 这将分配归零内存 并且malloc 可以按需分配内存 是否有一个函数结合了这两个属性 或许可以直接拨打电话mmap 如果可以的话为什么calloc不做吗 有几种机制可以从操作系统获取预清零内存 mmap
  • JavaScript 服务器端?

    是否有可能使用 javascript 服务器端 从而不会在某些核心计算的页面源代码中显示 我正在开发一款游戏 代码的一个关键部分只需要在服务器端计算然后传回客户端 我的整个游戏都是用 Javascript 编写的 但大部分是客户端 这很好
  • 如何使用 blazor 读取剪贴板?

    我正在使用具有截屏功能的 Blazor Server 应用程序 我的目标是从剪贴板获取数据 我谈论的不仅是简单的文本 而且总体上是一些图像 文件 文本等 我有一个名为ClipboardService它使用Microsoft JSIntero
  • 如何在 C# 中读取 html 表 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions table thead tr td
  • Clojure 中的数字是否按区间排列?

    有没有比以下更好的方法 defn in interval Returns a predicate that tests if its argument falls in the inclusive interval a b a b fn x
  • 绘制箱线图时如何处理 NaN 值

    我正在使用 matplotlib 绘制框图 但有一些缺失值 NaN 然后我发现它不显示具有 NaN 值的列内的方框图 你知道如何解决这个问题吗 这是代码 import numpy as np import matplotlib pyplot