你的表格太丑了!能用Python美化下嗎?
公眾號:尤而小屋
作者:Peter
編輯:Peter
大家好,我是寶器!
有時候看到一份表格,沒有任何的顏色修飾,總覺得缺點美觀效果。在Excel中我們可以直接對字體的顏色、大小等進行設(shè)置,還可以進行單元格的顏色填充,在plotly中美化表格輸出主要是有兩種方式:
使用go.Table方法 使用figure_factory的creat_table方法

導入庫
import pandas as pd
import numpy as np
import plotly_express as px
import plotly.graph_objects as go # 方法1:go.Table
import plotly.figure_factory as ff # 方法2:圖形工廠
go.Table實現(xiàn)
該方法類似其他的圖表繪制,直接使用go.Table方法之后往其中加入數(shù)據(jù)
基礎(chǔ)表格
添加表頭和單元格中的數(shù)據(jù)
import plotly.graph_objects as go
fig = go.Figure(data=[go.Table(
header=dict(values=['語文', '數(shù)學']), # 表頭:列表形式
cells=dict(values=[[100, 90, 140, 123], # 單元格添加:第一列元素
[105, 135, 75, 95]])) # 第二列元素
])
fig.show()

個性化表格設(shè)置
import plotly.graph_objects as go
fig = go.Figure(data=[go.Table(
header=dict(values=['語文', '數(shù)學'], # 表頭:字典形式
line_color="darkslategray", # 表頭線條顏色
fill_color="lightskyblue", # 表頭填充色
align="center" # 文本顯示位置 'left', 'center', 'right'
),
cells=dict(values=[[100, 90, 140, 123], # 單元格添加:第一列元素
[105, 135, 75, 95]], # 第二列元素
line_color="darkslategray", # 單元格線條顏色
fill_color="lightcyan", # 單元格填充色
align="center" # 文本顯示位置
))])
fig.update_layout(width=600,height=400)
fig.show()

DataFrame轉(zhuǎn)成表格
將DataFrame數(shù)據(jù)快速轉(zhuǎn)成漂亮的表格

# 繪圖
fig = go.Figure(
data=[go.Table(
header=dict(values=list(data.columns), # 表頭取值是data列屬性
fill_color='paleturquoise', # 填充色和文本位置
align='left'),
cells=dict(values=[data.性別,data.年齡,data.成績], # 單元格的取值就是每個列屬性的Series取值
fill_color='lavender',
align='left'
)
)]
)
fig.show()

改變row和column的大小
有時候單元格的數(shù)據(jù)太長,我們需要進行單元格大小的調(diào)整
import plotly.graph_objects as go
values = [["李白 唐代","杜甫 唐代","蘇軾 宋代","王安石 宋代"], # 第一列數(shù)據(jù)
["床前明月,疑是地上霜;舉頭望明月,低頭思故鄉(xiāng)",
"國破山河在,城春草木深。感時花濺淚,恨別鳥驚心。<br>烽火連三月,家書抵萬金。白頭騷更短,渾欲不勝簪。",
"十年生死兩茫茫,不思量,自難忘。千里孤墳,無處話凄涼。<br>縱使相逢應不識,塵滿面,鬢如霜。<br>夜來幽夢忽還鄉(xiāng),小軒窗,正梳妝。相顧無言,惟有淚千行。<br>料得年年腸斷處,明月夜,短松岡。",
"念往昔、繁華競逐。嘆門外樓頭,悲恨相續(xù)。<br>千古憑高,對此謾?quán)禈s辱。<br>六朝舊事隨流水,但寒煙、芳草凝綠。<br>至今商女,時時猶唱后庭遺曲。"
]]
fig = go.Figure(data=[go.Table(
columnorder = [1,2], # 列屬性的順序
columnwidth = [800,4000], # 列屬性中元素所占單元格整體大小
# 表頭
header = dict(
values=[["唐宋作家"],["代表作品"]], # 兩個表頭
line_color='darkslategray', # 線條和填充色
fill_color='royalblue',
align=['left','center'], # 位置
font=dict(color='white', size=12), # 表頭文本的顏色和字體大小
font_size=12,
height=40 # 高度
),
# 單元格設(shè)置
cells = dict(
values=values, # 數(shù)據(jù)
line_color='darkslategray', # 線條顏色
fill=dict(color=['paleturquoise', 'white']),
align=['left', 'center'], # 兩個列屬性文本顯示位置
font_size=12, # 字體大小
height=50))
])
#fig.update_layout(width=600,height=400)
fig.show()

設(shè)置表格漸變色
import plotly.graph_objects as go
import pandas as pd
colors = ['rgb(239, 243, 255)', # rgb值越接近255,越接近白色
'rgb(189, 215, 231)',
'rgb(107, 174, 214)',
'rgb(59, 130, 189)',
'rgb(9, 81, 156)']
data = {'Year' : [2015, 2016, 2017, 2018, 2019],
'Color' : colors}
df = pd.DataFrame(data)
print(df)
fig = go.Figure(data=[go.Table(
# 表頭
header=dict(
values=["Color", "<b>YEAR</b>"], # 表頭名稱
line_color='white',
fill_color='white',
align='center',
font=dict(color='black', size=12)
),
# 單元格
cells=dict(
values=[df.Color, df.Year], # 兩個列屬性
line_color=[df.Color],
fill_color=[df.Color],
align='center',
font=dict(color='black', size=13)
))
])
fig.show()

表格數(shù)據(jù)滑動
當DataFrame中的數(shù)據(jù)過多的時候,我們可以進行滑動展示和查看:
student = pd.DataFrame({"性別":["小明","小紅","小周","小孫","小蘇"] * 100, # 將數(shù)據(jù)同時擴大100倍
"年齡":[19,29,32,20,18] * 100,
"性別":["男","女","男","女","男"] * 100,
"成績":[590,588,601,670,555] * 100})
student

# 繪圖
fig = go.Figure(
data=[go.Table(
header=dict(values=list(student.columns), # 表頭取值是data列屬性
fill_color='paleturquoise', # 填充色和文本位置
align='left'),
cells=dict(values=[student.性別,student.年齡,student.成績], # 單元格的取值就是每個列屬性的Series取值
fill_color='lavender',
align='left'
)
)]
)
fig.show()

creat_table
第二種方法是使用圖形工廠中的creat_table方法來生成
基礎(chǔ)圖表生成

DataFrame數(shù)據(jù)生成表格

import plotly.figure_factory as ff
fig = ff.create_table(tips) # 將生成的tips數(shù)據(jù)放入
fig.show()

數(shù)據(jù)中添加鏈接

設(shè)置寬度
import plotly.figure_factory as ff
data = [['姓名', '年齡', '成績'], # 表頭
['小明', 20, 620], # 每個列表代表一行記錄
['小紅', 22, 677],
['小周', 19, 606]]
fig = ff.create_table(data,height_constant=20) # 改變寬度
#fig = ff.create_table(data,height_constant=50)
fig.show()

改變寬度后的樣子:

顏色設(shè)置
import plotly.figure_factory as ff
# 顏色設(shè)置
colorscale = [[0, '#4d004c'],[.5, '#f2e5ff'],[1, '#ffffff']] # 表格中設(shè)置3種顏色
#colorscale = [[0, '#4d004c'],[.25,'#0ac37d'],[.5, '#f2e5ff'],[.75,'#afc271'],[1, '#1ff1ff']] # 5種顏色
fig = ff.create_table(tips, colorscale=colorscale)
fig.show()


字體顏色設(shè)置
import plotly.figure_factory as ff
data = [['name', 'rank'], ['小明', 1], ['小紅', 2],
['小周', 3], ['小張', 4], ['小孫', 5], ['小王', 6]]
# 顏色設(shè)置
colorscale = [[0, '#272D31'],[.5, '#ff9f9f'],[1, '#ffffff']]
# 字體顏色設(shè)置
font=['#7CFCFC', '#0FEE00', '#008B00', '#F04F00', '#6A0000', '#CD0000', '#FF3030']
fig = ff.create_table(data, # 添加數(shù)據(jù)、顏色
colorscale=colorscale,
font_colors=font)
fig.layout.width=500 # 表格整體寬度設(shè)置
fig.show()

圖形和表格聯(lián)用
采用的消費數(shù)據(jù)集tips
import plotly.graph_objs as go
import plotly.figure_factory as ff
# 添加表格
fig = ff.create_table(tips)
# 添加圖形
fig.add_trace(go.Scatter(
x=tips["tip"],
y=tips["total_bill"],
marker=dict(color='#9099ff'), # 標記顏色
name="total_bill <br>tip",
xaxis='x2', yaxis='y2'
))
fig.add_trace(go.Scatter(
x=tips["size"],
y=tips["total_bill"],
marker=dict(color='#a099af'),
name="total_bill <br>size",
xaxis='x2', yaxis='y2'
))
fig.update_layout(
title_text="消費數(shù)據(jù)圖表聯(lián)合",
height=500,
margin={"t":75,"b":100},
xaxis = {'domain': [0, .45]},
xaxis2 = {'domain': [0.6, 1.]},
yaxis2 = {'anchor': 'x2', 'title': 'tips'}
)
fig.show()

將圖形豎直方向上排列:
import plotly.graph_objs as go
import plotly.figure_factory as ff
# 添加表格
fig = ff.create_table(tips)
# 添加圖形
fig.add_trace(go.Scatter(
x=tips["tip"],
y=tips["total_bill"],
marker=dict(color='#9099ff'), # 標記顏色
name="total_bill <br>tip",
xaxis='x2', yaxis='y2'
))
fig.add_trace(go.Scatter(
x=tips["size"],
y=tips["total_bill"],
marker=dict(color='#a099af'),
name="total_bill <br>size",
xaxis='x2', yaxis='y2'
))
fig.update_layout(
title_text="消費數(shù)據(jù)圖表聯(lián)合",
height=800,
margin={"t":75,"l":50},
yaxis = {'domain': [0, .5]}, # domain 圖形占比范圍
xaxis2 = {'anchor': "y2"}, # anchor表示是和y2一起作為繪圖的坐標軸
yaxis2 = {'domain': [0.6, 1], 'anchor':'x2', 'title': 'tips'}
)
fig.show()

評論
圖片
表情
