从图中找到对应的X轴值

问题描述 投票:0回答:1

请从互联网上检查我的代码。我试图从图表中找到 Y 轴值 10、50 和 90 处的 X 轴值。但是 np.intercep() 不起作用。

我尝试过Y截距等方法。但找不到解决我的问题的方法。

from pandas import DataFrame
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = {'opening': [4.75, 2, 0.850, 0.425, 0.250, 0.150, 0.075],
        'mass_retained': [0, 10.7, 14.3, 20.8, 23.8, 15.7, 9.2]}

df = DataFrame(data)

def calculate_percent_finer(df):
    total_mass = df.mass_retained.sum()
    arr = []
    for count, sieve in enumerate(df.opening.values):
        cumulative_mass = sum([df.mass_retained.values[i] for i in range(count + 1)])
        percent_finer = ((total_mass - cumulative_mass) / total_mass) * 100
        arr.append(percent_finer)
    return df.assign(p_finer=arr)

df2 = calculate_percent_finer(df)

x= df2.opening
y= df2.p_finer
plt.style.use('bmh')
plt.plot(df2.opening, df2.p_finer,'-gD')
plt.gca().invert_xaxis()
plt.xlabel('Grain Size (mm)')
plt.ylabel('Percent Passing')

plt.show()


我使用了以下代码。但没有成功

np.interp(10, df2.p_finer,df2.opening)

有没有办法在图表上画出 y=10、50 和 90 的线来查看 X 轴值。

谢谢

python analysis intercept
1个回答
0
投票

要让

np.interp
正常工作,轴中的每个元素都必须大于前一个元素,而原始数据中的情况并非如此,因此我们可以添加
df2.sort_values('p_finer', inplace=True)
使其为真,在这种情况下,该调用的工作原理如下预计。

为了在图表上放置一些线条来显示这些插值的位置,我们可以循环请求的值并使用您已经使用过的相同绘图调用添加一些线条。

以下是对原始代码进行最小修改的示例:

from pandas import DataFrame
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

requested_values = [10, 50, 90]

data = {'opening': [4.75, 2, 0.850, 0.425, 0.250, 0.150, 0.075],
        'mass_retained': [0, 10.7, 14.3, 20.8, 23.8, 15.7, 9.2]}

df = DataFrame(data)

def calculate_percent_finer(df):
    total_mass = df.mass_retained.sum()
    arr = []
    for count, sieve in enumerate(df.opening.values):
        cumulative_mass = sum([df.mass_retained.values[i] for i in range(count + 1)])
        percent_finer = ((total_mass - cumulative_mass) / total_mass) * 100
        arr.append(percent_finer)
    return df.assign(p_finer=arr)

df2 = calculate_percent_finer(df)
df2.sort_values('p_finer', inplace=True)

x= df2.opening
y= df2.p_finer
plt.style.use('bmh')
plt.plot(df2.opening, df2.p_finer,'-gD')
plt.gca().invert_xaxis()
plt.xlabel('Grain Size (mm)')
plt.ylabel('Percent Passing')

for interp_value in requested_values:
    calced_interp = np.interp(interp_value, df2.p_finer, df2.opening)
    print(interp_value, calced_interp)
    plt.plot([calced_interp, max(df2.opening)], [interp_value] * 2, '-', linewidth=1, color='grey', label=f'{interp_value:3} -> {calced_interp:5.3f}')
    plt.plot([calced_interp] * 2, [interp_value, min(df2.opening)], '-', linewidth=1, color='grey')
plt.legend()
plt.show()

当我运行时,我得到以下控制台打印和绘图:

10 0.15159235668789806
50 0.4143382352941176
90 2.321261682242992

如果您有任何疑问,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.