Matplotlib绘制双列横向柱状图异常及双x轴实现问题求助
Matplotlib双横向柱状图问题解答
1. 第二列数据不显示的原因
两组数据量级差距过大:n列数值在百万~千万级别,而m列数值仅为数千,共用同一个X轴时,m列的柱子长度相对于n列几乎可以忽略,视觉上就像完全被隐藏了。
2. 双X轴分别绑定两组数据的实现方法
可以通过twiny()方法生成第二个顶部X轴,分别绑定两组数据,各自独立设置数值范围:
- 第一组
n列数据绑定顶部X轴 - 第二组
m列数据绑定底部X轴
两套坐标轴独立计算刻度,不会出现单轴下数值差距过大导致的显示问题。
3. Y轴国家标签偏移的原因
原代码存在两处配置错误导致偏移:
yticks设置为ind + width,等于把标签对齐到了第二根柱子的侧边,而不是两根柱子的中间位置ylim的起始值设置为2*width - 1得到负数,压缩了Y轴的显示范围,导致上下标签位置异常
修正后完整可运行代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.DataFrame(dict(graph=["Indian","Egyptian","Emirati","Philippino","Syrian","Pakistani","Jordanian", "British","Lebanese","American","Chinese","Ukrainian","Canadian","Russian", "French","Saudi","Sudanese","Moroccan","Nigerian","Palestinian","German","Iranian", "Italian","Turkish","Tunisian"], n=[33060621,28185470,25327222,14033365,13895316,13335555,13067230,9065737,8871022,3914119,3875486, 3505868,3421358,3407623,3067701,2940321,2824929,2620922,2510789,2439167,1874219,1800495,1852571,1415189,1657462], m=[13504,13762,9671,4568,4995,8016,6808,5559,5456,4137,2802,1011,2386,1806,4408,2002,1141,1530,916,992,1933,1651, 1628,1469,839])) ind = np.arange(len(df)) width = 0.4 fig, ax1 = plt.subplots(figsize=(15,20)) # 底部X轴绘制m列 ax1.barh(ind, df.m, width, color='green', label='M') ax1.set_xlabel('M 数值范围', color='green') ax1.tick_params(axis='x', labelcolor='green') # 生成顶部X轴绘制n列 ax2 = ax1.twiny() ax2.barh(ind + width, df.n, width, color='red', label='N') ax2.set_xlabel('N 数值范围', color='red') ax2.tick_params(axis='x', labelcolor='red') # 修正Y轴刻度和标签,对齐到两根柱子中间 ax1.set(yticks=ind + width/2, yticklabels=df.graph, ylim=[-width, len(df)]) # 合并两个轴的图例 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right') plt.show()
内容的提问来源于stack exchange,提问作者Lenda Marwan
相关产品推荐
相关产品推荐

