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

如何绘制随海拔变化的多组数据频率条形图?

问题描述

我需要绘制随海拔变化的多组条形图,现有A、B、C、D、E五个取值范围为0-10的2D数组,要统计每个数组内各数值的频率,希望在同一图中展示堆叠式或类似的条形图,也接受其他合适的图表类型。

以下是我当前尝试的Python代码:

import numpy as np
import pandas as pd

a = np.random.randint(10, size=(11,11))
b = np.random.randint(10, size=(11,11))
c = np.random.randint(10, size=(11,11))
d = np.random.randint(10, size=(11,11))
e = np.random.randint(10, size=(11,11))

t = np.arange(0,11)
a_counts = np.array([])
for num in t:
    cnt = (a == num).sum()/a.size
    a_counts = np.append(a_counts, cnt)

b_counts = np.array([])
for num in t:
    cnt = (b == num).sum()/b.size
    b_counts = np.append(b_counts, cnt)

c_counts = np.array([])
for num in t:
    cnt = (c == num).sum()/c.size
    c_counts = np.append(c_counts, cnt)

d_counts = np.array([])
for num in t:
    cnt = (d == num).sum()/d.size
    d_counts = np.append(d_counts, cnt)

e_counts = np.array([])
for num in t:
    cnt = (e == num).sum()/e.size
    e_counts = np.append(e_counts, cnt)

comb =  {10:a_counts,20:b_counts,30:c_counts,40:d_counts,50:e_counts}
comb_df = pd.DataFrame(comb)

comb_df.plot.bar()

当前生成的图表:横轴为数值0-10,纵轴为频率,每个横轴刻度对应5个并列的条形,分别代表A、B、C、D、E数组的频率。

目标图表样式:以海拔(10、20、30、40、50)为横轴,每个海拔对应一个堆叠条形,条形的不同分段代表0-10各数值的频率占比,直观展示每个海拔下各数值的频率分布。


解决方案

1. 优化频率统计代码

用np.bincount替代循环,更高效地统计0-10的频率:

def calculate_freq(arr):
    # 展平数组并统计频率,minlength确保覆盖0-10所有取值
    counts = np.bincount(arr.flatten(), minlength=11)
    return counts / arr.size

a_counts = calculate_freq(a)
b_counts = calculate_freq(b)
c_counts = calculate_freq(c)
d_counts = calculate_freq(d)
e_counts = calculate_freq(e)

2. 调整DataFrame结构适配堆叠图

让DataFrame的行对应海拔、列对应数值0-10,这样每个行就能生成一个堆叠条形:

# 构建DataFrame,索引为海拔值,列是0-10的数值
t = np.arange(0,11)
comb_df = pd.DataFrame(
    [a_counts, b_counts, c_counts, d_counts, e_counts],
    index=[10, 20, 30, 40, 50],
    columns=t
)

3. 绘制堆叠条形图

调用plot.bar(stacked=True)生成堆叠效果,并完善图表标注:

import matplotlib.pyplot as plt

# 绘制堆叠条形图
ax = comb_df.plot.bar(stacked=True, figsize=(10, 6))

# 设置图表标签
ax.set_xlabel('海拔')
ax.set_ylabel('频率')
ax.set_title('各海拔下数值0-10的频率分布')

# 调整图例位置避免遮挡
plt.legend(title='数值', bbox_to_anchor=(1.05, 1), loc='upper left')

# 自动调整布局
plt.tight_layout()
plt.show()

4. 其他可选图表类型

如果堆叠条形图不符合需求,还可以尝试:

  • 热力图:用颜色深浅直观对比各海拔下的数值频率分布:
import seaborn as sns

plt.figure(figsize=(10, 6))
sns.heatmap(comb_df.T, cmap='Blues', annot=True, fmt='.2f')
plt.xlabel('海拔')
plt.ylabel('数值')
plt.title('各海拔下数值频率热力图')
plt.show()

内容的提问来源于stack exchange,提问作者Charanjit Pabla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:11:17