在我的 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 图表上绘制了多少个数据点?的主要内容,如果未能解决你的问题,请参考以下文章
Python matplotlib - 如何在x轴上绘制一条线?