I have a plot that needs names as the values for the x-axis. I imagine this is accomplished via the set_x_axis function for chart objects but can't find the proper key in the documentation (http://xlsxwriter.readthedocs.io/chart.html#set_x_axis). The following code produces the graph below:
chart = workbook.add_chart({'type':'scatter'})
colLetter = alphabet[1] #alphabet is list of alphabet
for ii in range(4):
colLetter = alphabet[ii+1]
chart.add_series({
'name': '=Sheet1!$%s$1'%colLetter,
'categories': '=Sheet1!$A$2:$A$'+str(lastRowNumber),
'values': '=Sheet1!$%s$2:$%s$6'%(colLetter, colLetter),
})
chart.set_title({'name': 'Cityblock'})
chart.set_x_axis({'name': 'Subject'})
chart.set_y_axis({'name': 'Distance'})
chart.set_style(11)
worksheet.insert_chart('F1', chart)
Any suggestions? I'm using xlsxwriter with python 2.7.
Just set the series categories to point to the strings, or numbers, or dates that you wish to plot.
For example:
import xlsxwriter
workbook = xlsxwriter.Workbook('chart.xlsx')
worksheet = workbook.add_worksheet()
# Add a column chart.
chart = workbook.add_chart({'type': 'column'})
# Write some data to add to plot on the chart.
worksheet.write_column('A1', ['Bob', 'Eve', 'Ann'])
worksheet.write_column('B1', [5, 10, 7])
# Configure the chart.
chart.add_series({'categories': '=Sheet1!$A$1:$A$3',
'values': '=Sheet1!$B$1:$B$3'})
# Insert the chart into the worksheet.
worksheet.insert_chart('D1', chart)
workbook.close()
Output:
Related
Task: I am writing the dataframe/tables into excel file with the insightful charts. To write into excel file I am using xlsxwriter for adding charts and everything.
I have attached one sample output which currently I am getting.
Generated the pie chart from the percentages reference. For adding percentages into the excel file I have set the formulas. So I don't have any reference to the values.
I tried different configurations but I didn't get any satisfactory results.
Here, is one sample code to get the same chart with the same problem which currently I am facing.
The data points are overlapping.
import xlsxwriter
# Create a workbook and add a worksheet
workbook = xlsxwriter.Workbook('pie_chart.xlsx')
worksheet = workbook.add_worksheet()
# Add the data to the worksheet
data = [84,11,2,0,2]
labels = ['A', 'B', 'C', 'D', 'E']
worksheet.write_column('A1', data)
worksheet.write_column('B1', labels)
# Create a pie chart
pie_chart = workbook.add_chart({'type': 'pie'})
pie_chart.add_series({
'name': 'Pie Chart',
'categories': '=Sheet1!$B$1:$B$5',
'values': '=Sheet1!$A$1:$A$5',
'data_labels': {'percentage': True},
})
# Insert the pie chart into the worksheet
worksheet.insert_chart('D1', pie_chart)
# # Save the workbook
workbook.close()
Current output:
Expected output:
The pie chart without data points overlapping.
Just to be clear, XlsxWriter isn't overlapping or positioning the labels, Excel is doing it when it renders the file format.
In general Excel tries to avoid overlapping labels when rendering charts but it can happen if the data segments are very small or close together. You can maybe make it a bit better by specifying leader lines and best_fit positioning. Something like this:
import xlsxwriter
# Create a workbook and add a worksheet
workbook = xlsxwriter.Workbook('pie_chart.xlsx')
worksheet = workbook.add_worksheet()
# Add the data to the worksheet
data = [84,11,2,0,2]
labels = ['A', 'B', 'C', 'D', 'E']
worksheet.write_column('A1', data)
worksheet.write_column('B1', labels)
# Create a pie chart
pie_chart = workbook.add_chart({'type': 'pie'})
pie_chart.add_series({
#'name': 'Pie Chart',
'categories': '=Sheet1!$B$1:$B$5',
'values': '=Sheet1!$A$1:$A$5',
'data_labels': {'percentage': True,
'leader_lines': True,
'position': 'best_fit'},
})
# Insert the pie chart into the worksheet
worksheet.insert_chart('D1', pie_chart)
# # Save the workbook
workbook.close()
Output:
In Excel it is also possible to manually position the data labels for finer grained adjustment but that isn't supported by XlsxWriter.
I am trying to create a bar chart in excel in reverse order categories.
The following does the trick:
chart.set_y_axis({ 'reverse': True})
But then the the x-axis values are on top of the chart, while I want to keep them on the bottom.
I tried to reverse the order then move the x-axis labels via:
chart.set_x_axis({ 'label_position': 'low'})
This does not seem to do anything. That is strange, because if I don't reverse the y-axis and just set the x-axis position to 'high", then it does move the x-axis values to the top. So I don't know why it won't also move it to the bottom.
How can I reverser the order of categories in an excel bar chart, while keeping the x-axis values at the bottom?
Example code:
import pandas as pd
# Some sample data to plot.
list_data = [10, 20, 30, 20, 15, 30, 45]
# Create a Pandas dataframe from the data.
df = pd.DataFrame(list_data)
# Create a Pandas Excel writer using XlsxWriter as the engine.
excel_file = 'column.xlsx'
sheet_name = 'Sheet1'
writer = pd.ExcelWriter(excel_file, engine='xlsxwriter')
df.to_excel(writer, sheet_name=sheet_name)
workbook = writer.book
worksheet = writer.sheets[sheet_name]
# Create a chart object.
chart = workbook.add_chart({'type': 'bar'})
# Reverse Order
chart.set_y_axis({ 'reverse': True,
'label_position': 'low'
})
# Try and fail to get x-axis values on bottom instead of top
chart.set_x_axis({ 'label_position': 'low'
})
# Configure the series of the chart from the dataframe data.
chart.add_series({
'values': '=Sheet1!$B$2:$B$8',
})
# Insert the chart into the worksheet.
worksheet.insert_chart('D2', chart)
# Close the Pandas Excel writer and output the Excel file.
writer.save()
P.s. Not sure if such comments are allowed here, but xlsxwriter is the best thing since sliced bread!
To get the type of output that you want in Excel (and XlsxWriter) you need to set the crossing point for the axis using the "Axis crosses at maximum category" option.
With XlsxWriter you can do it using the axis crossing parameter. Like this:
import pandas as pd
# Some sample data to plot.
list_data = [10, 20, 30, 20, 15, 30, 45]
# Create a Pandas dataframe from the data.
df = pd.DataFrame(list_data)
# Create a Pandas Excel writer using XlsxWriter as the engine.
excel_file = 'column.xlsx'
sheet_name = 'Sheet1'
writer = pd.ExcelWriter(excel_file, engine='xlsxwriter')
df.to_excel(writer, sheet_name=sheet_name)
workbook = writer.book
worksheet = writer.sheets[sheet_name]
# Create a chart object.
chart = workbook.add_chart({'type': 'bar'})
# Reverse Order
chart.set_y_axis({'reverse': True,
'crossing': 'max'})
# Configure the series of the chart from the dataframe data.
chart.add_series({'values': '=Sheet1!$B$2:$B$8'})
# Insert the chart into the worksheet.
worksheet.insert_chart('D2', chart)
# Close the Pandas Excel writer and output the Excel file.
writer.save()
Output:
i used this example to get started with pandas:
http://pandas-xlsxwriter-charts.readthedocs.io/chart_grouped_column.html#chart-grouped-column
i also want to save the chart in excel just like in the example
i would like to know how e.g. in the example above i can add a description or a table under the graph chart
the only thing related i found was this :
Add graph description under graph in pylab
but this is done with pylab, is the same possible with pandas and an excel chart?
In Excel you could add a text box and insert some text but that isn't possible with XlsxWriter.
You could use the chart title property but in Excel the title is generally at the top and not the bottom.
You can reposition it, manually, in Excel. This is also possible with XlsxWriter using the layout options of the different chart objects.
Here is an example:
import xlsxwriter
workbook = xlsxwriter.Workbook('chart.xlsx')
worksheet = workbook.add_worksheet()
# Create a new Chart object.
chart = workbook.add_chart({'type': 'column'})
# Write some data to add to plot on the chart.
data = [
[1, 2, 3, 4, 5],
[2, 4, 6, 8, 10],
[3, 6, 9, 12, 15],
]
worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])
worksheet.write_column('C1', data[2])
# Configure the charts. In simplest case we just add some data series.
chart.add_series({'values': '=Sheet1!$A$1:$A$5'})
chart.add_series({'values': '=Sheet1!$B$1:$B$5'})
chart.add_series({'values': '=Sheet1!$C$1:$C$5'})
chart.set_x_axis({'name': 'X axis title'})
chart.set_y_axis({'name': 'Y axis title'})
chart.set_title({
'name': 'Here is some text to describe the chart',
'name_font': {'bold': False, 'size': 10},
'layout': {
'x': 0.25,
'y': 0.90,
}
})
chart.set_plotarea({
'layout': {
'x': 0.11,
'y': 0.10,
'width': 0.75,
'height': 0.60,
}
})
#Insert the chart into the worksheet.
worksheet.insert_chart('A7', chart)
workbook.close()
Note, you will need to do some trial and error with the layout property to get the layout that you want.
Output:
Hi I have some basic code below which has M values on the x-axis and N-values on the y-axis.
I would like to be able to create the chart which I get from using matplotlib but in Microsoft Excel. Is this possible?
I've tried: chart = workbook.add_chart({'type': 'scatter'})
but without any success. Is there an alternative 'type' which would allow me to get a similar chart to that which I get in matplotlib?
M = [-2.29, 33.63, 66.52, 96.37, 123.10, 146.79, 167.49, 185.20, 199.94, 211.68, 220.44, 226.22, 229.02, 230.25, 227.07, 220.91, 211.77, 199.64, 184.53, 164.48, 141.67, 0.00]
N = [-292.20, 6.65, 305.47, 604.25, 901.94, 1198.81, 1495.67, 1792.54, 2089.41, 2386.27, 2683.14, 2980.01, 3276.88, 3561.89, 3858.76, 4155.63, 4452.49, 4749.36, 5046.23, 5361.80, 5666.67, 5666.67]
import pandas as pd
# Create a Pandas dataframe from some data for M.
df1 = pd.DataFrame({'M (kNm)': [M[0], M[1], M[2],
M[3], M[4], M[5], M[6], M[7],
M[8], M[9], M[10], M[11], M[12],
M[13], M[14], M[15], M[16], M[17],
M[18], M[19], M[20], M[21]]})
# Create a Pandas dataframe from some data for N.
df2 = pd.DataFrame({'N (kN)': [N[0], N[1], N[2],
N[3], N[4], N[5], N[6], N[7],
N[8], N[9], N[10], N[11], N[12],
N[13], N[14], N[15], N[16], N[17],
N[18], N[19], N[20], N[21]]})
# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('MN_example.xlsx', engine='xlsxwriter')
# Convert the dataframe to an XlsxWriter Excel object.
df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet1', startcol=1, index=False)
# Get the xlsxwriter workbook and worksheet objects.
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# Create a chart object.
chart = workbook.add_chart({'type': 'scatter'})
# Configure the series of the chart from the dataframe data.
chart.add_series({'values': '=Sheet1!$A$2:$B$23'})
# Insert the chart into the worksheet.
worksheet.insert_chart('D2', chart)
# Close the Pandas Excel writer and output the Excel file.
writer.save()
import matplotlib.pyplot as plt
plt.plot(M, N, linewidth=2)
plt.show()
You almost have it, you just need to specify the chart subtype and also specify the data categories that the chart should be plotted on.
Replace the chart initialization and configuration with the following and your should get what you want:
# Create a chart object.
chart = workbook.add_chart({'type': 'scatter',
'subtype': 'smooth'})
# Configure the series of the chart from the dataframe data.
chart.add_series({
'categories': ['Sheet1', 1, 0, len(df2), 0],
'values': ['Sheet1', 1, 1, len(df2), 1]})
Output:
I'm trying to generate simple pie chart for better visualization of some data, but XlsxWriter wont write data to two columns simultaneously. Where as other example is working fine.
I'm clueless where I might be going wrong
Following is the data :
{'core2': [10.3], 'core3': [4.17], 'core0': [58.68], 'core1': [24.42], 'core6': [0.02], 'core7': [0.0], 'core4': [2.31], 'core5': [0.12]})
Actual data is passed as list -> [10.3, 4.17, 58.68, 24.42, 0.02, 0.0, 2.31, 0.12] to below function
Please find below code :
def draw_simultaneously_busy_cores(type_of_chart,data,workbook):
print data
worksheet = workbook.add_worksheet()#'simultaneously_busy_cores')
bold = workbook.add_format({'bold': 1})
headings = [0, 1, 2, 3, 4, 5, 6, 7]
worksheet.write_column('$A$1', headings, bold)
worksheet.write_column('$B$1',headings)
chart1 = workbook.add_chart({'type': type_of_chart})
chart1.add_series({
'name': 'Simultaneous Busy Cores',
'categories': ['simultaneously_busy_cores', '=simultaneously_busy_cores!$A$1:$A$8'],
'values': ['simultaneously_busy_cores', '=simultaneously_busy_cores!$B$1:$B$8'],
#'data_labels': {'percentage': True, }
})
#Add a title.
chart1.set_title({'name': 'Simultaneous Busy Cores'})
#Set an Excel chart style. Colors with white outline and shadow.
chart1.set_style(10)
#Insert the chart into the worksheet (with an offset).
worksheet.insert_chart('C2', chart1, {'x_offset': 25, 'y_offset': 10})
thanks in advance. Image shows the outpput :
It should work. Here is an example with sample data:
import xlsxwriter
def draw_simultaneously_busy_cores(type_of_chart, data, workbook):
worksheet = workbook.add_worksheet('simultaneously_busy_cores')
bold = workbook.add_format({'bold': 1})
worksheet.write_column('A1', data, bold)
worksheet.write_column('B1', data)
chart1 = workbook.add_chart({'type': type_of_chart})
chart1.add_series({
'name': 'Simultaneous Busy Cores',
'categories': '=simultaneously_busy_cores!$A$1:$A$8',
'values': '=simultaneously_busy_cores!$B$1:$B$8',
})
#Add a title.
chart1.set_title({'name': 'Simultaneous Busy Cores'})
#Set an Excel chart style. Colors with white outline and shadow.
chart1.set_style(10)
#Insert the chart into the worksheet (with an offset).
worksheet.insert_chart('C2', chart1, {'x_offset': 25, 'y_offset': 10})
workbook = xlsxwriter.Workbook('test.xlsx')
data = [0, 1, 2, 3, 4, 5, 6, 7]
draw_simultaneously_busy_cores('line', data, workbook)
workbook.close()
Output:
The chart categories and values syntax in your example is incorrect. You are mixing the list and string syntaxes. Read through the documentation and examples again.