Blog
How To Create Dot Chart Using xlChart+ Add-in?
Flowing these steps to create dot chart:

First, select data in the worksheet.

Click “2D Line Chart” item in “Line Chart” menu in xlChart+ add-in, open “Create a Line Chart” dialog box.

Click “OK” button.

You can change the colormap by selecting another item in “Select a colormap” dropbox in “Create a Line Chart” dialog box.



What Is xlChart+ Add-in?
xlChart+ add-in helps you create common charts faster with one-click color schemes. Create histograms, KDE plots, jitter scatter plots, heatmaps, violin plots, raincloud plots, and other charts that Excel doesn’t have.
Main Features
One-Click Color Schemes
Apply professional color palettes to your charts instantly
Beautiful Pre-designed Palettes
Choose from dozens of carefully crafted color schemes designed by professionals. Each palette is optimized for clarity, accessibility, and visual appeal. Transform your charts from basic to stunning with a single click.
- 20+ professional color palettes
- Colorblind-friendly options
- Custom palette creator

2D & 3D Histograms
Visualize data distributions with advanced histogram charts

Advanced Distribution Analysis
Create sophisticated 2D and 3D histograms that Excel can’t produce natively. Perfect for statistical analysis, data exploration, and presenting frequency distributions with professional polish.
- Customizable bin sizes
- 3D visualization support
- Overlay multiple distributions
2D & 3D KDE Plots
Kernel Density Estimation for smooth probability distributions
Smooth Density Visualization
Generate beautiful Kernel Density Estimation plots that show the probability density function of your data. Perfect for understanding data distribution patterns and identifying peaks, valleys, and outliers.
- Multiple kernel functions
- Adjustable bandwidth
- 3D surface plots

Jitter Scatter Plots & Regular Scatter Plots
Reveal patterns in your data with advanced scatter plot techniques

Enhanced Scatter Visualization
Create jitter scatter plots that prevent overlapping points, making it easier to see data density. Perfect for categorical data and revealing patterns that traditional scatter plots might hide.
- Automatic jitter adjustment
- Size and color mapping
- Trend line overlays
Heatmaps
Visualize complex data matrices with intuitive color gradients
Matrix Data Visualization
Transform complex data matrices into intuitive heatmaps. Perfect for correlation analysis, time-series data, and identifying patterns across multiple variables at a glance.
- Hierarchical clustering
- Custom color scales
- Annotation support

Violin Plots & Raincloud Plots
Advanced statistical visualization for distribution comparison

Rich Distribution Insights
Combine the best of box plots, density plots, and scatter plots. Violin plots show the full distribution shape, while raincloud plots add individual data points for complete transparency.
- Show full data distribution
- Compare multiple groups
- Statistical annotations
How To Set Effects: Glow 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
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')
sht.api.Range('A2:B7').Select() #数据
shp=sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlColumnClustered,20,20,350,250,True)
cht=shp.Chart #添加图表
shadow=cht.SeriesCollection(1).Format.Shadow
shadow.Type=21
shadow.Visible=True
shadow.Style=2 #msoShadowStyleOuterShadow
shadow.Blur=4
shadow.OffsetX=4.9497474683
shadow.OffsetY=4.9497474683
shadow.RotateWithShape=False
shadow.ForeColor.RGB=xw.utils.rgb_to_int((0,0,0))
shadow.Transparency=0.599999994
shadow.Size=100
sht.api.Range('A2:C11').Select() #数据
shp2=sht.api.Shapes.AddChart2(-1, xw.constants.ChartType.xlLine, 30, 20, 350, 250, True)
cht2=shp2.Chart #添加图表
cht2.SeriesCollection(1).Format.Shadow.Type=24
cht2.SeriesCollection(2).Format.Shadow.Type=24
set_style(cht)
cht.Export(root+'/cht.jpg')
cht.Export(root+'/cht.svg')
cht.ExportAsFixedFormat(0,root+'/cht.pdf')
cht2.Export(root+'/cht2.jpg')
cht2.Export(root+'/cht2.svg')
cht2.ExportAsFixedFormat(0,root+'/cht2.pdf')
#wb.save()
#app.kill()

How To Set Picture/Texture Fill for Areas Using xlwings?
【Method】
FillFormat object
- UserPicture method
- UserTextured method
sht.api.Range(‘A1:B7’).Select()
cht=sht.api.Shapes.AddChart().Chart
ser=cht.SeriesCollection(‘P1’) #First series
ff=ser.Format.Fill
ff.UserPicture(root+r’/picpy.jpg’)
ser2=cht.SeriesCollection(‘P2’) #Second series
ff2=ser2.Format.Fill
ff2.UserTextured(root+r’/picpy2.jpg’)
【Example】

【Code】
#Area settings - Picture and texture fill
import xlwings as xw
import os
root = os.getcwd()
app = xw.App(visible=True, add_book=False)
wb=app.books.open(root+r'/P1P2.xlsx',read_only=False)
sht=wb.sheets(1)
sht.api.Range('A1:B7').Select()
cht=sht.api.Shapes.AddChart().Chart
ser=cht.SeriesCollection('P1') #First series
ff=ser.Format.Fill
ff.UserPicture(root+r'/picpy.jpg')
ser2=cht.SeriesCollection('P2') #Second series
ff2=ser2.Format.Fill
ff2.UserTextured(root+r'/picpy2.jpg')
#wb.save()
#wb.close()
#app.kill()

How To Set Pattern Fill for Areas Using xlwings?
【Method】
FillFormat object
- Patterned method
sht.api.Range(‘A1:B7’).Select()
cht=sht.api.Shapes.AddChart().Chart
ser=cht.SeriesCollection(‘P1’) #First series
ff=ser.Format.Fill
ff.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))
ff.Patterned(43)
ser2=cht.SeriesCollection(‘P2’) #Second series
ff2=ser2.Format.Fill
ff2.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))
ff2.TwoColorGradient(1,1)
ff2.BackColor.RGB=xw.utils.rgb_to_int((255,255,0))
【Example】

【Code】
#Area settings - Two-color gradient and pattern fill
import xlwings as xw
import os
root = os.getcwd()
app = xw.App(visible=True, add_book=False)
wb=app.books.open(root+r'/P1P2.xlsx',read_only=False)
sht=wb.sheets(1)
sht.api.Range('A1:B7').Select()
cht=sht.api.Shapes.AddChart().Chart
ser=cht.SeriesCollection('P1') #First series
ff=ser.Format.Fill
ff.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))
ff.Patterned(43)
ser2=cht.SeriesCollection('P2') #Second series
ff2=ser2.Format.Fill
ff2.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))
ff2.TwoColorGradient(1,1)
ff2.BackColor.RGB=xw.utils.rgb_to_int((255,255,0))
#wb.save()
#wb.close()
#app.kill()

How To Set Transparency and Color Fill of Areas Using xlwings?
【Method】
By referencing the `Format.Fill` property of the Series object, a `FillFormat` object is returned, representing the area object in the series. The members of the `FillFormat` object can be used to set properties for the area object.
– Transparency property
– ForeColor property
– OneColorGradient method
– TwoColorGradient method
– Solid method
sht.api.Range(‘A1:B7’).Select()
cht=sht.api.Shapes.AddChart().Chart
ser=cht.SeriesCollection(‘P1’) #First series
ff=ser.Format.Fill
ff.Transparency=0.7
ser2=cht.SeriesCollection(‘P2’) #Second series
ff2=ser2.Format.Fill
ff2.OneColorGradient(1,1,1)
【Example】

【Code】
#Area settings - Transparency and solid gradient
import xlwings as xw
import os
root = os.getcwd()
app = xw.App(visible=True, add_book=False)
wb=app.books.open(root+r'/P1P2.xlsx',read_only=False)
sht=wb.sheets(1)
sht.api.Range('A1:B7').Select()
cht=sht.api.Shapes.AddChart().Chart
ser=cht.SeriesCollection('P1') #First series
ff=ser.Format.Fill
ff.Transparency=0.7
ser2=cht.SeriesCollection('P2') #Second series
ff2=ser2.Format.Fill
ff2.OneColorGradient(1,1,1)
#wb.save()
#wb.close()
#app.kill()

How To Set Properties of Line Graphic Elements Using xlwings?
【Method】
By referencing the `Format.Line` property of a Series object, a `LineFormat` object is returned, representing the line object in the series. The members of the `LineFormat` object are used to set the line properties.
sht.api.Range(‘A1:B7’).Select()
cht=sht.api.Shapes.AddChart().Chart
ser2=cht.SeriesCollection(‘P2’) #Second series
ser2.ChartType=xw.constants.ChartType.xlLine #Line chart
ser2.Smooth=True #Smooth processing
ser2.MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle #Markers
ser2.MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255)) #Color
ser2.HasDataLabels=True #Data labels
【Example】

【Code】
#Line chart element settings
import xlwings as xw
import os
root = os.getcwd()
app = xw.App(visible=True, add_book=False)
wb=app.books.open(root+r'/P1P2.xlsx',read_only=False)
sht=wb.sheets(1)
sht.api.Range('A1:B7').Select()
cht=sht.api.Shapes.AddChart().Chart
ser2=cht.SeriesCollection('P2') #Second series
ser2.ChartType=xw.constants.ChartType.xlLine #Line chart
ser2.Smooth=True #Smooth processing
ser2.MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle #Markers
ser2.MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255)) #Color
ser2.HasDataLabels=True #Data labels
ser=cht.SeriesCollection('P1')
ser.Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0,255,0))
ser.Format.Fill.ForeColor.ObjectThemeColor=10
ser.Format.Fill.ForeColor.SchemeColor=3
ser2.Format.Line.DashStyle=4
ser2.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))
#wb.save()
#wb.close()
#app.kill()

How To Set Chart Colors Using xlwings?
【Method】
sht.api.Range(‘A1:B7’).Select()
cht=sht.api.Shapes.AddChart().Chart
ser2=cht.SeriesCollection(‘P2’) #Second series
ser2.ChartType=xw.constants.ChartType.xlLine #Line chart
ser2.Smooth=True #Smooth processing
ser2.MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle #Markers
ser2.MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255)) #Color
ser2.HasDataLabels=True #Data labels
ser=cht.SeriesCollection(‘P1’)
ser.Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0,255,0))
ser.Format.Fill.ForeColor.ObjectThemeColor=10
ser.Format.Fill.ForeColor.SchemeColor=3
【Example】

【Code】
#Color Settings
import xlwings as xw
import os
root = os.getcwd()
app = xw.App(visible=True, add_book=False)
wb=app.books.open(root+r'/P1P2.xlsx',read_only=False)
sht=wb.sheets(1)
sht.api.Range('A1:B7').Select()
cht=sht.api.Shapes.AddChart().Chart
ser2=cht.SeriesCollection('P2') #Second series
ser2.ChartType=xw.constants.ChartType.xlLine #Line chart
ser2.Smooth=True #Smooth processing
ser2.MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle #Markers
ser2.MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255)) #Color
ser2.HasDataLabels=True #Data labels
ser=cht.SeriesCollection('P1')
ser.Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0,255,0))
#ser.Format.Fill.ForeColor.ObjectThemeColor=10
#ser.Format.Fill.ForeColor.SchemeColor=3
#wb.save()
#wb.close()
#app.kill()

How To Show Data With Conditional Formating Data Bars Using xlwings?
Method
rng=sht.Range(‘A1:A15’)
rng.FormatConditions.Delete()
rng.FormatConditions.AddDatabar()
Sample Code
#Conditional Formatting - Data Bars
import xlwings as xw #Import xlwings
import os #Import os
root = os.getcwd() #Get current path
#Create Excel application window, visible, no workbook added
app=xw.App(visible=True, add_book=False)
#Open data file, writable
bk=app.books.open(fullname=root+r'\cf.xlsx',read_only=False)
#Get data worksheet
sht=bk.api.Sheets(1)
rng=sht.Range('A1:A15')
rng.FormatConditions.Delete()
rng.FormatConditions.AddDatabar()
#bk.save()
#bk.close()
#app.kill()

How To Refresh a Pivot Table Using xlwings?
Method
def modify_data():
#Modify data source
sht_data.range(‘F2′).value=’China’
def update():
#Refresh pivot table
pvt=sht_pvt.api.PivotTables(‘Pivot’)
pvt.RefreshTable()
Sample Code
#Refresh Pivot Table
import xlwings as xw #Import xlwings
import os #Import os
root = os.getcwd() #Get current path
#Create Excel application window, visible, no workbook added
app=xw.App(visible=True, add_book=False)
#Open data file, writable
bk=app.books.open(fullname=root+r'\Pivot.xlsx',read_only=False)
#Get data source worksheet
sht_data=bk.sheets.active
#Data cell range
rng_data=sht_data.api.Range('A1').CurrentRegion
#Create a new worksheet for the pivot table
sht_pvt=bk.sheets.add()
sht_pvt.name='Pivot Table'
def create_pivot_table():
#Location of data
rng_data=sht_data.api.Range('A1').CurrentRegion
#Location of pivot table
rng_pvt=sht_pvt.api.Range('A1')
#Create pivot table cache
pvc=bk.api.PivotCaches().Create(\
SourceType=xw.constants.PivotTableSourceType.xlDatabase,\
SourceData=rng_data)
#Create pivot table
pvt=pvc.CreatePivotTable(\
TableDestination=rng_pvt,\
TableName='Pivot')
#Set fields
pvt.PivotFields('Category').Orientation=\
xw.constants.PivotFieldOrientation.xlPageField #Page fields
pvt.PivotFields('Category').Position=1
pvt.PivotFields('Product').Orientation=\
xw.constants.PivotFieldOrientation.xlColumnField #Column fields
pvt.PivotFields('Product').Position=1
pvt.PivotFields('Origin').Orientation=\
xw.constants.PivotFieldOrientation.xlRowField #Row fields
pvt.PivotFields('Origin').Position=1
pvt.PivotFields('Amount').Orientation=\
xw.constants.PivotFieldOrientation.xlDataField #Value fields
def modify_data():
#Modify data source
sht_data.range('F2').value='China'
def update():
#Refresh pivot table
pvt=sht_pvt.api.PivotTables('Pivot')
pvt.RefreshTable()
create_pivot_table()
modify_data()
update()
#bk.save()
#bk.close()
#app.kill()
