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

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 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥20 小规模孤立词识别系统设计
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪
  • ¥15 esp8266 tally灯 接收端改为发射端
  • ¥30 Labview代码调用access 数据库,相同代码其中一个调用不出来是为什么
  • ¥15 基于51单片机的交通灯系统,找改程序有点急