You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:11:51