Gnuplot:xticlabel字符串值、字体大小调整及累积直方图绘制问题
嘿,我完全懂你遇到的困扰——那个特殊的>100分类确实容易卡壳,尤其是还要搭配顶部的累积曲线。下面我用Python的pandas和matplotlib给你一套落地的解决方案,亲测好用:
解决方案步骤
1. 先把数据捋顺
首先确保你的数据结构没问题,不管是从csv读还是手动构造,discharge列要保留>100作为字符串分类,不用强行转成数值。举个示例数据:
import pandas as pd # 模拟你的数据结构 data = pd.DataFrame({ "discharge": ["0-10", "10-20", "20-50", "50-100", ">100"], "probability": [0.2, 0.3, 0.25, 0.15, 0.1] })
2. 绘制直方图+累积曲线的核心代码
思路很直接:用分类标签当x轴画直方图,同时计算累积概率画曲线,>100会自动排在x轴最后一位,完全不用特殊处理:
import matplotlib.pyplot as plt # 先算累积概率,直接累加就行 data["cumulative_prob"] = data["probability"].cumsum() # 创建画布和第一个坐标轴(直方图用) fig, ax1 = plt.subplots(figsize=(10, 6)) # 画直方图(柱状图) bars = ax1.bar(data["discharge"], data["probability"], color="#1f77b4", alpha=0.7, label="区间概率") ax1.set_xlabel("流量区间 (m³/s)") ax1.set_ylabel("概率") ax1.set_title("流量区间概率分布与累积概率曲线") ax1.legend(loc="upper left") # 加第二个坐标轴画累积曲线 ax2 = ax1.twinx() ax2.plot(data["discharge"], data["cumulative_prob"], color="#ff7f0e", marker="o", linewidth=2, label="累积概率") ax2.set_ylabel("累积概率") ax2.legend(loc="upper right") # 给柱子加数值标签(可选,让图表更清晰) for bar in bars: height = bar.get_height() ax1.text(bar.get_x() + bar.get_width()/2., height, f'{height:.2f}', ha='center', va='bottom') # 自动调整布局,避免标签重叠 plt.tight_layout() plt.show()
3. 关键细节说明
>100作为字符串分类,matplotlib会直接把它放在x轴的最后位置,和你数据里的顺序完全一致,完美对应“汇总所有大于100的流量”的需求。- 累积概率的计算是直接对
probability列做累加,最后一个值自然就是所有概率的总和(如果你的概率是归一化过的,就是1.0),刚好对应到>100这个分类的累积值。 - 如果你的
discharge列前面的是纯数值(比如不是区间字符串),只需要把整个列转成字符串,再把最后一行改成>100就行:data["discharge"] = data["discharge"].astype(str) data.loc[data.index[-1], "discharge"] = ">100"
这样处理后,你要的带累积曲线的直方图就能完美展示那个特殊的>100分类啦!
内容的提问来源于stack exchange,提问作者Sebastian Roe
相关产品推荐
相关产品推荐

