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

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 关于网上一个easyx制作的见缝插针小游戏(c++)
    • ¥15 开地址法双散列函数处理碰撞
    • ¥15 想问一下这个是什么情况 虚拟机Linux打不开了
    • ¥15 联通光猫掉注册了怎么重新注册上去
    • ¥15 关于unity开发steamvr程序遇到的问题
    • ¥60 求tc downloader的下载方式
    • ¥15 华为 快捷方式 手电筒 接口
    • ¥15 Qt6.5支不支持Android13开发啊
    • ¥20 网络只能跑一半,应该如何设置
    • ¥20 Python调用百度开发者平台人脸识别接口