在我的 matplotlib 图表上绘制了多少个数据点?

Posted

技术标签:

【中文标题】在我的 matplotlib 图表上绘制了多少个数据点?【英文标题】:How many data points are plotted on my matplotlib graph? 【发布时间】:2020-02-06 08:39:39 【问题描述】:

所以我想计算在我的图表上绘制的数据点的数量,以保持对图表数据的总跟踪。问题是,与可能具有或不具有 NaN 值的另一列相比,我的数据表将它弄乱到在不同行中有一些 NaN 值的地方。例如:

# I use num1 as my y-coordinate and num1-num2 for my x-coordinate.
num1 num2 num3 
1    NaN  25 
NaN  7    45
3    8    63
NaN  NaN  23
5    10   42
NaN  4    44

#So in this case, there should be only 2 data point on the graph between num1 and num2. For num1 and num3, there should be 3. There should be 4 data points between num2 and num3.

我相信 Matplotlib 不会绘制包含 NaN 值的列的行,因为它的 null (如果我错了,请纠正我,我只能告诉这一点,因为 x 的 0 坐标上没有点和y 轴)。一开始,我认为我可以使用 .count() 并找到两列中较小的一个并将其用作我的跟踪器,但实际上这不会像我上面的示例所示那样工作,因为它甚至可以更少因为一个可能有 NaN 值,而另一个可能有实际值。我做的一些代码示例:

# both x and y are columns within the DataFrame and are used to "count" how many data points are # being graphed.
def findAmountOfDataPoints(colA, colB):
    if colA.count() < colB.count():
         print(colA.count())           # Since its a smaller value, print the number of values in colA.
    else: 
         print(colB.count())              # Since its a smaller value, print the number of values in colB.

另外,我考虑过使用 .value_count() 但我不确定这是否是我正在寻找的确切功能来完成我想要的。有什么建议吗?

编辑 1:更改数据框名称以使示例更清晰。

【问题讨论】:

@TrentonMcKinney 这个问题在我的例子中得到了解释。我只能找到两列中的最低值,但是,另一列中可能有一个 NaN 值,如我的示例中所示,不会被绘制出来。我会改变我的例子来证明这一点。 @TrentonMcKinney 好的,我更新了我的示例来解释它是如何不起作用的。看看 num1 有 3 个不是 NaN 的值,而 num2 有 4 个不是 NaN 的值吗?现在,当将这两者绘制在一起时,只会绘制第 3 行和第 5 行(如果您希望它从 0 开始,则为第 2 行和第 4 行)。因此,图上只有 2 个数据点,使用 df.count() 无法找到。 @TrentonMcKinney 很抱歉,我留下它是为了表明我尝试了这个问题并且没有得到我想要的结果。那么, df.dropna() 是否完全忽略了我得到的数据框中的整行?我仍然想将该行保留在我的数据框中,因为我有一个很大的 x 列,我仍想为其他图表保留该行。 【参考方案1】:

如果我正确理解了您的问题,假设您的表是 pandas 数据框df,则以下代码应该可以工作:

sum((~np.isnan(df['num1']) & (~np.isnan(df['num2']))))

它是如何工作的:

np.isnan 如果单元格是 Nan,则返回 True。 ~np.isnan 是相反的,因此它在不是 Nan 时返回 True。

代码检查列“num1”和列“num2”都包含非 Nan 值的位置,换句话说,对于同时存在这两个值的行,它返回 True。

最后,那些好的行用sum 计数,它只考虑True 值。

【讨论】:

伙计,这是一个很好的检查方法。理论上也是有道理的。那么 np.isnan() 每次都会遍历每个单元格吗? 在某种程度上,是的。 np.isnan() 检查输入数组(在本例中为数据框的列)并返回一个具有相同形状的布尔数组,其中只有 True(对于输入数组中为 Nan 的单元格)和 False(对于那些不是的单元格) t 南)。如果你使用 ~np.isnan 则相反。【参考方案2】:

我理解的方式是需要不是NaN的点的组合数量。使用我发现的一个函数,我想出了这个:

import pandas as pd
import numpy as np

def choose(n, k):
    """
    A fast way to calculate binomial coefficients by Andrew Dalke (contrib).
    https://***.com/questions/3025162/statistics-combinations-in-python
    """
    if 0 <= k <= n:
        ntok = 1
        ktok = 1
        for t in range(1, min(k, n - k) + 1):
            ntok *= n
            ktok *= t
            n -= 1
        return ntok // ktok
    else:
        return 0


data = 'num1': [1, np.nan,3,np.nan,5,np.nan],
        'num2': [np.nan,7,8,np.nan,10,4],
        'num3': [25,45,63,23,42,44]
        

df = pd.DataFrame(data)

df['notnulls'] = df.notnull().sum(axis=1)

df['plotted'] = df.apply(lambda row: choose(int(row.notnulls), 2), axis=1)
print(df)
print("Total data points: ", df['plotted'].sum())

有了这个结果:

   num1  num2  num3  notnulls  plotted
0   1.0   NaN    25         2        1
1   NaN   7.0    45         2        1
2   3.0   8.0    63         3        3
3   NaN   NaN    23         1        0
4   5.0  10.0    42         3        3
5   NaN   4.0    44         2        1
Total data points:  9

【讨论】:

以上是关于在我的 matplotlib 图表上绘制了多少个数据点?的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 图未显示

Python matplotlib - 如何在x轴上绘制一条线?

Python/MatPlotLib:无法在 y 轴上打印正确的数据

使用 MatPlotLib 绘制连续的数据流

使用 matplotlib 在单个图表上绘制两个直方图

我无法使用 MatplotLib 生成图表以在 PyQt5 App 上绘图