从图表中找到对应的X轴值

0 投票
1 回答
25 浏览
提问于 2025-04-12 04:13

请帮我看看我从网上找到的代码。我想从图表中找到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轴值了。

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

演示的 matplotlib 图,显示在请求的插值位置有灰色线条

如果你有任何问题,随时问我!

撰写回答