Python 如何使用openpyxl创建预测值图表?

Python 如何使用openpyxl创建预测值图表?,python,openpyxl,Python,Openpyxl,我有一些数据,其中包括实际值和预测值。有没有一种方法可以用openpyxl来表示这一点 资料 实际预测 1月10日 2000年2月11日 2000年3月12日 2009年4月15日 137k年5月 六月125k 167k年7月 184k年8月 2009年9月20日 十月二十二日 2000年11月24日 十二月二十九日 渴望的 做 欢迎提出任何建议您可以创建一个包含2个系列的系列:1个系列的Y轴值来自实际列,1个系列的Y轴值来自预测列。两个系列都将使用从第1列开始的月份作为X轴值 这些步骤是:

我有一些数据,其中包括实际值和预测值。有没有一种方法可以用openpyxl来表示这一点

资料

实际预测
1月10日
2000年2月11日
2000年3月12日
2009年4月15日
137k年5月
六月125k
167k年7月
184k年8月
2009年9月20日
十月二十二日
2000年11月24日
十二月二十九日
渴望的

欢迎提出任何建议

您可以创建一个包含2个系列的系列:1个系列的Y轴值来自实际列,1个系列的Y轴值来自预测列。两个系列都将使用从第1列开始的月份作为X轴值

这些步骤是:

  • 定义一个
  • 为X和Y值的单元格范围定义一个值
  • 使用
    .add_data
    .append
    将Y值添加为
    系列
  • 用于添加X值(作为标签)
  • 使用
    将图表添加到工作表中。添加图表
  • 数据的问题在于,所有数字都有一个
    k
    后缀,这使得它不是数字,并且无法通过openpyxl正确打印(即使在Excel中,它也被视为文本,打印时等于0)。我假设“100k”是“100000”的意思,所以为了让事情更简单,让我们用“100”代替“100k”,把“k”放在标签中,比如“实际(k)”

    如果Excel文件中已有该数据,如下所示:

    然后在
    折线图中绘制的代码如下所示:

    从openpyxl导入加载\u工作簿
    从openpyxl.chart导入折线图、参考、系列
    #path=“C:/Users/tanisha.hudson/wb1.xlsx”
    路径='wb1.xlsx'
    wb=加载\u工作簿(路径)
    ws=wb.active
    c1=线形图()
    c1.title=‘图表标题’
    c1.legend.position='b'#https://openpyxl.readthedocs.io/en/stable/charts/chart_layout.html#legend-布局
    实际值=参考值(ws,最小列=2,最大列=2,最小列=1,最大列=13)
    实际_系列=系列(实际_值,标题_来自_数据=真)
    c1.追加(实际_系列)
    预测值=参考值(ws,最小列=3,最大列=3,最小行=1,最大行=13)
    预测系列=系列(预测值,标题来自数据=真)
    c1.追加(预测系列)
    xaxis_值=参考(ws,最小列=1,最大列=1,最小行=2,最大行=13)
    c1.设置_类别(xaxis_值)
    ws.add_图表(c1,‘E2’)
    wb.save('wb1-chart.xlsx')
    
    注:

  • 行/列从1开始(不像典型数组中的0)。例如,
    实际_值
    引用范围列B和行1-13
  • 包含标题为“实际”和“预测”的行,因为在创建
    系列时,我们使用
    title\u from\u data=True
    。您可以省略标题行,并使用
    title=
    参数分别设置
    Series
    标题
  • 不要忘记调用
    .add_chart
    将折线图添加到工作表中。另外,最好
    。将其另存为一个文件,以防弄乱原始工作表
  • 输出:

    请注意,由于实际数据值和预测数据值也未连接,因此2系列未连接。解决方法是添加一个公共数据点。例如,将Jun=125添加到Forecast列():

    wb=load\u工作簿(路径)
    ws=wb.active
    ws['C7'].value=ws['B7'].value#将上次实际值复制为预测值
    ...
    

    现在,如果您的输入数据确实有一个
    k
    后缀,并且您不想手动修改它们以去除该
    k
    ,只需在打印之前使用openpyxl重写这些值:

    用于范围(2,14)中的行:#B2-B13,C2-C13
    对于范围(2,4)中的列:#B-C
    cell=ws.cell(列=列,行=行)
    old_val=cell.value
    新值=整数(旧值替换('k',''),如果旧值为“其他”
    cell.value=新值
    ws['C7'].value=ws['B7'].value
    
    有关更多信息,请参阅openpyxl文档的部分。

    如果某些功能是特定于版本的:Python 3.8.8、openpyxl 3.0.7、Office 2016。

    现在运行代码时会得到什么?你有错误吗?从的openpyxl文档中,您似乎缺少对
    .add\u chart
    的调用。save
    。谢谢@Gino-您能看看我的最新帖子吗?它涉及面积图的透明度。我一直在研究这个问题,不知道如何增加透明度层。谢谢
    from openpyxl import Workbook
    from openpyxl.chart import (
        LineChart,
        BarChart,
        Reference,
        Series,
    )
    
    wb = Workbook()
    ws = wb.active
    
    path = "C:/Users/tanisha.hudson/wb1.xlsx"
    wb_obj = load_workbook(path)
    sheet_obj = wb_obj.active
    
    c1 = LineChart()
    
    v1 = Reference(ws, min_col=1, min_row=1, max_col=13)
    c1.add_data(v1, titles_from_data=True, from_rows=True)
    
    c1.x_axis.title = 'Chart Title'
    c1.y_axis.majorGridlines = None