Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有条件地更改特定单元格的背景色_Python_Pandas_Matplotlib_Colors - Fatal编程技术网

Python 有条件地更改特定单元格的背景色

Python 有条件地更改特定单元格的背景色,python,pandas,matplotlib,colors,Python,Pandas,Matplotlib,Colors,我有一个数据框,我可以将它保存为png文件。但是现在我想改变满足特定条件的特定单元格的背景色 条件: 80岁或以上的数字必须有绿色背景 低于80的数字必须有红色背景 所有列名和索引单元格都需要黑色背景和白色文本颜色 下面的帖子接近我想要的,但没有提供我需要的答案。 我的代码: import matplotlib.pyplot as plt from pandas.tools.plotting import table import pandas as pd #My dataframe d

我有一个数据框,我可以将它保存为png文件。但是现在我想改变满足特定条件的特定单元格的背景色

条件:

  • 80岁或以上的数字必须有绿色背景
  • 低于80的数字必须有红色背景
  • 所有列名和索引单元格都需要黑色背景和白色文本颜色
下面的帖子接近我想要的,但没有提供我需要的答案。

我的代码:

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.
这就是它当前的样子:

这就是我希望它看起来的样子

您可以这样做:

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')