upai小新 2022-04-20 14:50 采纳率: 100%
浏览 339
已结题

python 画双柱状图和折线图的组合图报错的问题

问题遇到的现象和发生背景

这是我的数据

img


想要画这样的图

img


根据教程

img


在我自己敲代码时候发现有一行报错

    x=data.月份
    y1=data.上期
    y2=data.本期
    y3=data.同比增长率
    plt.figure(figsize=(8, 140))
    plt.subplot(111)
    bar_width = 0.4   # 设置柱状高度
    # 在主坐标轴绘制柱形图
    plt.bar(x, y1, bar_width, label="2022年")
    plt.bar(x+str(bar_width), y2, bar_width, label="2021年")#str(bar_width)
    plt.ylim(0, max(y1.max(), y3.max()) * 1.2) # 设置坐标轴的取值范围,避免柱子过高而与图例重叠
    plt.legend(loc='upper left')   # 设置图例
    plt.xticks(x) # 设置横坐标的标签

发现 plt.bar(x+bar_width, y2, bar_width, label="2021年")报错,报错内容为

img


将该代码更正为
plt.bar(x+str(bar_width), y2, bar_width, label="2021年")
发现图显示为

img


我希望图是这样的

我想要达到的结果

img

附全部代码

from pylab import mpl
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
htnames=["全院分月诊疗人次同期对比","1院区分月诊疗人次同期对比","2院区分月诊疗人次同期对比",
         "全院出院人次分月同期对比","1院区出院人次分月同期对比","2院区出院人次分月同期对比"]
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 正确显示中文
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号
plt.rcParams.update({'font.size': 16})  # 设置字体大小
for i in htnames:
    data=pd.read_excel("画图数据.xlsx",header=1,sheet_name=i)#,index_col=0
    x=data.月份
    y1=data.上期
    y2=data.本期
    y3=data.同比增长率
    plt.figure(figsize=(8, 140))
    plt.subplot(111)
    bar_width = 0.4   # 设置柱状高度
    # 在主坐标轴绘制柱形图
    plt.bar(x, y1, bar_width, label="2022年")
    plt.bar(x+str(bar_width), y2, bar_width, label="2021年")#str(bar_width)
    plt.ylim(0, max(y1.max(), y3.max()) * 1.2) # 设置坐标轴的取值范围,避免柱子过高而与图例重叠
    plt.legend(loc='upper left')   # 设置图例
    plt.xticks(x) # 设置横坐标的标签
    # 在次坐标轴上绘制折线图
    plt.twinx()
    plt.plot(x, y3, ls='-', lw=3, color='r', marker='o', label='同比增长率')    # ls:线的类型,lw:宽度,o:在顶点处实心圈
    plt.ylim(-0, 1.35)    # 设置次坐标轴的取值范围,避免折线图波动过大
    plt.legend()# 设置图例
    def to_percent(number, position=0):    # 定义显示百分号的函数
        return '%.f' % (number * 100) + '%'
    from matplotlib.ticker import FuncFormatter    # 次坐标轴的标签显示百分号 FuncFormatter:自定义格式函数包
    plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))
    plt.title(i, fontsize=36, loc='center', color='k')# 设置标题
    plt.show()
    plt.savefig(i+".png",dpi=400,bbox_inches="tight")
    plt.clf()






  • 写回答

1条回答 默认 最新

  • 藏猊 2022-04-20 15:16
    关注

    img


    这里x+bar_width 应该是适用于x为数值的情况下,通过整体移动bar_width来达到双柱的效果.
    你的x本身是字符串,加上str的bar_width当然是没有效果
    你可以先将x转成等长度的数组
    [ix for ix in range(len(x))]
    然后再加bar_width
    最后整体修改x轴标识

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 修改了问题 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题