从图表中找到对应的X轴值
请帮我看看我从网上找到的代码。我想从图表中找到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
如果你有任何问题,随时问我!