2016-11-16 265 views
2

我有一個包含6個選項卡(工作表)的excel文件。每個工作表都具有相同的結構幷包含兩列 - 第1列包含品牌名稱,第2列包含與每個品牌對應的值。對於excel文件中的每張表格,我想製作一個餅圖,顯示每個品牌的%份額。xlsxwriter - Excel餅圖圖例 - python

你可以用它來運行該腳本上是here

我寫的代碼非常簡單,並生成圖表的例子xls文件。問題在於圖表的圖例需要序列號名稱而不是品牌的名稱。

import pandas as pd 
import xlsxwriter as excel 

     df = pd.read_excel("/Users/jack/Documents/python-pptx/filename", sheetname=None) 


     workbook = excel.Workbook('/Users/jack/Documents/python-pptx/chart_pie.xlsx') 

     for sheetname, data in df.iteritems(): 
      if len(data) > 0: 
       worksheet = workbook.add_worksheet(sheetname) 
       chart = workbook.add_chart({'type': 'pie'}) 
       worksheet.write_column('A1', data['Brand']) 
       worksheet.write_column('B1', data['Share_of_interactions']) 
       chart.add_series({'categories': '='+sheetname+'!$A$1:$A$'+str(len(data)), 
            'values':  '='+sheetname+'!$B$1:$B$'+str(len(data)), 
            'name':  '='+sheetname+'!$A$1:$A$'+str(len(data))}) 

       ## insert chart into the worksheet 
       worksheet.insert_chart('C3', chart) 

       ## Close the workbook 
     workbook.close() 

以下是圖表的屏幕截圖:

enter image description here

如果在圖表的傳說1,2,3注意到..。 。 7。它實際上應該是說品牌名稱。如xlsxwriter - http://xlsxwriter.readthedocs.io/chart.html文檔中所述,我已將名稱參數添加到chart.add_series。任何幫助將非常感激。

+0

介意分享您的數據幀的樣本'df'? –

+0

@JulienMarrec讓我把它放在一起,並分享它。 – vagabond

+0

我已經分享了一個excel文件的鏈接。您可以使用它來運行該腳本。 – vagabond

回答

5

的問題是,你有一個空間,在您的工作表的名稱,如Sheet 1。你需要把它們放在單引號:

df = pd.read_excel("/Users/julien/Downloads/SO_Example_Df.xlsx", sheetname=None) 


workbook = excel.Workbook('/Users/julien/Downloads/SO_chart_pie.xlsx') 

for sheetname, data in df.items(): 
    if len(data) > 0: 
     worksheet = workbook.add_worksheet(sheetname) 
     chart = workbook.add_chart({'type': 'pie'}) 
     worksheet.write_column('A1', data['Brand']) 
     worksheet.write_column('B1', data['Share_of_interactions']) 
     # Here, add single quotes around the sheetname 
     chart.add_series({'categories': "='"+sheetname+"'!$A$1:$A$"+str(len(data)), 
          'values':  "='"+sheetname+"'!$B$1:$B$"+str(len(data)), 
          'name':  'My pie chart'}) 

     ## insert chart into the worksheet 
     worksheet.insert_chart('C3', chart) 

## Close the workbook 
workbook.close() 

enter image description here

+0

太棒了!這有效 - 你能解釋一下什麼'「='」+ sheetname +「'!$ A $ 1:$ A $」'評估爲? – vagabond

+0

將'print(「='」+ sheetname +「'!$ A $ 1:$ A $」+ str(len(data)))'添加到循環中,您會看到它的計算結果爲'='表1'!$ A $ 1:$ A $ 7'。與Excel中顯示的方式相同,如果選擇該數據,它會在表名稱周圍添加單引號(如果有空格) –

+0

再次感謝 - 非常棒 - 我根本沒有想到這一點,如果有的話!我的山羊是什麼如果沒有評估到精確表名稱,那麼爲什麼該程序仍在創建圖表? – vagabond

1

在Excel和XlsxWriter中,餅圖中數據點的名稱來自「類別」。這與名稱來自系列名稱的其他「2D」圖表類型不同。這是因爲餅圖是單個系列圖表的特例。

無論如何,如果您將您的類別指向您想要的名稱,它們將顯示。像這樣:

import pandas as pd 

# Some sample data to plot. 
data = {'apples': 10, 'berries': 32, 'squash': 21, 'melons': 13, 'corn': 18} 

# Create a Pandas dataframe from the data. 
df = pd.DataFrame([data], index=['Farm']) 

# Create a Pandas Excel writer using XlsxWriter as the engine. 
excel_file = 'pie.xlsx' 
sheet_name = 'Sheet1' 

writer = pd.ExcelWriter(excel_file, engine='xlsxwriter') 
df.to_excel(writer, sheet_name=sheet_name) 

# Access the XlsxWriter workbook and worksheet objects from the dataframe. 
workbook = writer.book 
worksheet = writer.sheets[sheet_name] 

# Create a chart object. 
chart = workbook.add_chart({'type': 'pie'}) 

# Configure the chart from the dataframe data. 
chart.add_series({ 
    'categories': ['Sheet1', 0, 1, 0, 5], 
    'values':  ['Sheet1', 1, 1, 1, 5], 
}) 

# Insert the chart into the worksheet. 
worksheet.insert_chart('A4', chart) 

# Close the Pandas Excel writer and output the Excel file. 
writer.save() 

此外,請注意使用類別和值的列表而不是範圍字符串。這種可選的格式在處理可變數據和處理任何工作表名稱引用時更容易。

輸出:

enter image description here

+0

但我確實將類別指向了名稱:'chart.add_series({'categories':'='+ sheetname +'!$ A $ 1:$ A $'+ str(len(data)), 'values': '='+ sheetname +'!$ B $ 1:$ B $'str(len(data)), 'name':'='+ sheetname +'!$ A $ 1:$ A $'str(len ))})'。即使我刪除了'name'參數,我也會得到相同的結果! – vagabond

+0

然後它應該工作,正如我在我的示例中所示。嘗試忽略「名稱」範圍,這應該只是一個單一的點。 – jmcnamara