如何绘制随海拔变化的多组数据频率条形图?
问题描述
我需要绘制随海拔变化的多组条形图,现有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
相关产品推荐
相关产品推荐

