How To Create Univariate Histogram Using xlwings?

Example

Code

import xlwings as xw
import os

def set_style(cht):
    cht.ChartArea.Format.Line.Visible=False
    cht.PlotArea.Format.Fill.Visible = False
    cht.PlotArea.Format.Line.Visible = True
    cht.PlotArea.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((200,200,200))
    #cht.PlotArea.Format.Line.ForeColor.ObjectThemeColor = msoThemeColorText1
    ax1 = cht.Axes(1)
    ax2 = cht.Axes(2)
    ax1.HasTitle = True
    ax1.AxisTitle.Text = 'Categories'
    ax1.AxisTitle.Font.Size = 10
    ax1.TickLabels.Font.Size = 8
    ax1.TickLabels.NumberFormat = '0.00'
    ax1.HasMajorGridlines = False
    ax2.HasTitle = True
    ax2.AxisTitle.Text = 'Values'
    ax2.AxisTitle.Font.Size = 10
    ax2.TickLabels.Font.Size = 8
    ax2.HasMajorGridlines = False
    cht.HasTitle = True
    #cht.ChartTitle.Caption = 'Plot'
    #cht.ChartTitle.Font.Size = 12

def draw_hist(sht,n):
    #频数分析
    x=sht.range('A1:A1000').value
    xi=[0 for _ in range(11)]
    xi2=[0 for _ in range(10)]
    count=[0 for _ in range(10)]
    bx=10
    minx=9999
    maxx=-9999
    for i in range(n):
        if minx>x[i]:
            minx=x[i]
        if maxx<x[i]:
            maxx=x[i]
    difx=maxx-minx
    stepx=difx/bx
    for i in range(10):
        count[i]=0
    xi[0]=minx
    xi2[0]=minx+stepx/2
    for i in range(1,11):
        xi[i]=xi[i-1]+stepx
        if i!=10:
            xi2[i]=xi[i]+stepx/2 
    for i in range(n):
        for j in range(10):
            if x[i]>=xi[j] and x[i]<xi[j+1]:
                count[j]+=1

    #根据频数绘制直方图
    sht.api.Range('D3').Select()
    shp=sht.api.Shapes.AddChart2()
    shp.Left=20
    cht=shp.Chart
    for i in range(cht.SeriesCollection().Count,0,-1):
        cht.SeriesCollection(i).Delete()

    cht.SeriesCollection().NewSeries()
    cht.SeriesCollection(1).ChartType=xw.constants.ChartType.xlColumnClustered
    cht.SeriesCollection(1).XValues=xi2
    cht.SeriesCollection(1).Values=count
    cht.ChartGroups(1).GapWidth=0
    cht.GapDepth=0
    
    fl=cht.SeriesCollection(1).Format.Fill
    fl.ForeColor.ObjectThemeColor=5    #msoThemeColorAccent1
    #fl.ForeColor.TintAndShade=0
    fl.ForeColor.Brightness=0
    fl.Solid()

    ln=cht.SeriesCollection(1).Format.Line
    ln.Visible=True
    ln.ForeColor.ObjectThemeColor=13    #msoThemeColorText1
    #ln.ForeColor.TintAndShade=0
    ln.ForeColor.Brightness=0.0500000007
  
    return cht

root=os.getcwd()
app=xw.App(visible=True,add_book=False)
wb=app.books.open(root+r'/data.xlsx',read_only=False)
sht=wb.sheets('Sheet1')
cht=draw_hist(sht,1000)
set_style(cht)

cht.Export(root+'/cht.jpg')
cht.Export(root+'/cht.svg')
cht.ExportAsFixedFormat(0,root+'/cht.pdf')

#wb.save()
#app.kill()
May 22, 2026 (0)


Leave a Reply

Your email address will not be published. Required fields are marked *