求助:用Matplotlib和Pandas绘制岩性RQD占比柱状图
解决方案
要实现每个岩性下各RQD区间的占比展示,核心是先计算单种岩性的总长度,再用各区间长度除以该总长度得到占比。以下是修改后的完整代码:
import pandas as pd import matplotlib.pyplot as plt # 定义RQD区间和对应名称 ranges = [(0, 10), (10.00001, 20), (20.00001, 30), (30.00001, 40), (40.00001, 50), (50.00001, 60), (60.00001, 70), (70.00001, 80), (80.0001,90), (90.00001, 1000)] names = ["0 to 10", "10 to 20", "20 to 30", "30 to 40", "40 to 50", "50 to 60", "60 to 70", "70 to 80", "80 to 90", "90 to 100"] # 给RQD值分配对应区间名称的函数 def assign_name(value): for low, high in ranges: if low <= value <= high: return names[ranges.index((low, high))] return None # 处理超出所有区间的值 # 添加RQD区间列和长度列 df['RQD_Bin'] = df['RQD'].apply(assign_name) df["Length"] = df["To"] - df["From"] # --- 关键修改部分 --- # 计算每个岩性的总长度,并添加到原数据中 df['Lithology_Total_Length'] = df.groupby('Lithology')['Length'].transform('sum') # 计算每个区间在对应岩性中的占比 df['Length_Percent'] = df['Length'] / df['Lithology_Total_Length'] # 按岩性和RQD区间分组,求和占比 lithology_distr = df.groupby(['Lithology', 'RQD_Bin'])['Length_Percent'].sum().unstack() # 绘制柱状图 lithology_distr.plot(kind='bar', stacked=False) # 自定义图表样式 plt.xlabel('岩性') plt.ylabel('RQD区间占比') # 更新Y轴标签为占比 plt.title('各岩性下RQD区间占比分布') plt.legend(title='RQD区间') plt.xticks(rotation=90) # 可选:将Y轴格式化为百分比显示,更直观 plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f'{x*100:.1f}%')) # 保存并展示图表 plt.savefig("RQD_Distribution_Percent.png") plt.show()
核心修改说明
- 计算岩性总长度:用
transform('sum')可以给每一行自动匹配对应岩性的总长度,无需手动合并数据集。 - 生成占比列:直接用单区间长度除以对应岩性的总长度,得到0-1范围的占比数值。
- 分组逻辑调整:现在分组后求和的是占比,最终每个岩性下所有RQD区间的占比之和为1(即100%)。
- 图表优化:更新Y轴标签为占比,添加百分比格式化器让显示更清晰。
内容的提问来源于stack exchange,提问作者cbarnard
相关产品推荐
相关产品推荐

