2016-03-15 157 views
2

我有一個DataFrame,我可以將它保存爲一個PNG文件。但是現在我想改變滿足特定條件的特定單元的背景顏色。有條件地改變特定單元格的背景顏色

條件:

  • 數字誰是80或更高,必須得到一個綠色的背景。
  • 低於80的數字必須顯示紅色背景。
  • 所有列名稱和索引單元都需要帶有白色文本顏色的黑色背景。

以下帖子接近我想要的,但沒有提供我需要的答案。 Post 1 Post 2

我的代碼:

import matplotlib.pyplot as plt 
from pandas.tools.plotting import table 
import pandas as pd 

#My dataframe 
df = pd.DataFrame({ 
    'Weeks' : [201605, 201606, 201607, 201608], 
    'Computer1' : [50, 77, 96, 100], 
    'Computer2' : [50, 79, 100, 80], 
    'Laptop1' : [75, 77, 96, 95], 
    'Laptop2' : [86, 77, 96, 40], 
    'Phone'  : [99, 99, 44, 85], 
    'Phone2' : [93, 77, 96, 25], 
    'Phone3' : [94, 91, 96, 33] 
}) 
df2 = df.set_index('Weeks') #Makes the column 'Weeks' the index. 

#Make a png file out of an dataframe. 
plt.figure(figsize=(9,3)) 
ax = plt.subplot(211, frame_on=False) # no visible frame 
ax.xaxis.set_visible(False) # hide the x axis 
ax.yaxis.set_visible(False) # hide the y axis 
table(ax, df2, rowLabels=df2.index, colLabels=df2.columns, loc='center', cellColours=None) 
plt.savefig('mytable.png') #save it as an png. 

這是它目前的樣子: enter image description here

這是我希望它看起來 enter image description here

回答

4

你可以做這樣的事情:

colors = df2.applymap(lambda x: 'green' if x>= 80 else 'red').reset_index().drop(['Weeks'], axis=1) 


tbl = table(ax, df2, loc='center', 
      cellColours=colors.as_matrix(), 
      colColours=['black']*len(colors.columns), 
      rowColours=['black']*len(colors)) 

設置索引的顏色:

[tbl._cells[row, -1]._text.set_color('white') for row in range(1, len(colors)+1)] 

設置標頭的顏色:

[tbl._cells[0, col]._text.set_color('white') for col in range(len(colors.columns))] 
plt.show() 

代碼(完整):

import matplotlib.pyplot as plt 
from pandas.tools.plotting import table 
import pandas as pd 

#My dataframe 
df = pd.DataFrame({ 
    'Weeks' : [201605, 201606, 201607, 201608], 
    'Computer1' : [50, 77, 96, 100], 
    'Computer2' : [50, 79, 100, 80], 
    'Laptop1' : [75, 77, 96, 95], 
    'Laptop2' : [86, 77, 96, 40], 
    'Phone'  : [99, 99, 44, 85], 
    'Phone2' : [93, 77, 96, 25], 
    'Phone3' : [94, 91, 96, 33] 
}) 
df2 = df.set_index('Weeks') #Makes the column 'Weeks' the index. 

colors = df2.applymap(lambda x: 'green' if x>= 80 else 'red') \ 
     .reset_index().drop(['Weeks'], axis=1) 

#print(colors) 

plt.figure(figsize=(10,5)) 

ax = plt.subplot(2, 1, 1, frame_on=True) # no visible frame 

#ax.xaxis.set_visible(False) # hide the x axis 
#ax.yaxis.set_visible(False) # hide the y axis 

# hide all axises 
ax.axis('off') 

# http://matplotlib.org/api/pyplot_api.html?highlight=table#matplotlib.pyplot.table 
tbl = table(ax, df2, 
      loc='center', 
      cellLoc='center', 
      cellColours=colors.as_matrix(), 
      colColours=['black']*len(colors.columns), 
      rowColours=['black']*len(colors), 
      #fontsize=14 
    ) 


# set color for index (X, -1) and headers (0, X) 
for key, cell in tbl.get_celld().items(): 
    if key[1] == -1 or key[0] == 0: 
     cell._text.set_color('white') 
    # remove grid lines 
    cell.set_linewidth(0) 

# refresh table 
plt.show() 

# save it as an png. 
plt.savefig('mytable.png') 

enter image description here

相關問題