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

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日

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面