编写了一个基于pyecharts库的通用方法,该方法可以快捷绘制格式较为标准的简单图,包含折线图、柱状图和堆叠柱状图(均支持多维形式)。
辅助类Dataset
这个类用于辅助绘图方法读取数据,方便自行拓展。
Python
class Dataset(object):
def __init__(self, df):
self.df = df
def get_index(self):
indices = self.df.index.astype(str).tolist()
return indices
def get_detail(self):
self.df.copy()
df_y = self.df
return df_y
绘图方法pyecharts_plot()
核心方法,支持以类型为横轴、数值为纵轴的一维或多维折线图('line'
)、柱状图('bar'
)和堆叠柱状图('stacked'
),有图例,可以进行百分比转换(pct=True
)。文字格式已预设为“宋体、黑色、25号”。
Python
def pyecharts_plot(
df,
x_name='period',
y_name='value',
file_name='example',
plot_type='line',
pct=False,
pct_cut=1,
font_size=25,
png=False,
):
"""
绘制以类型索引为横轴的折线图或柱形图
:param df: 以index-value组织的DataFrame数据
:param x_name: x轴标签
:param y_name: y轴标签
:param file_name: 存储文件名
:param plot_type: 支持line, bar和stacked
:param pct: 如果需要转换成百分比,设为True
:param pct_cut: 百分比保留到几位小数
:param font_size: 字号
:param png: 如果需要输出图片,设为True(但是比较慢)
:return: None
"""
dataset = Dataset(df)
plot = Line() if plot_type == 'line' else Bar()
plot.add_xaxis(dataset.get_index())
data_y = dataset.get_detail()
for col in data_y.columns:
data_list = (
[f'{v * 100:.{pct_cut}f}' for v in data_y[col].tolist()]
if pct else data_y[col].tolist()
)
# 堆叠柱形图特殊处理
if plot_type == 'stacked':
plot.add_yaxis(
series_name=col,
y_axis=data_list,
stack=f'{col}', # 该命名单类柱形保持一致即可,不影响呈现
label_opts=opts.LabelOpts(is_show=False)
)
else:
plot.add_yaxis(
series_name=col,
y_axis=data_list,
label_opts=opts.LabelOpts(is_show=False),
)
plot.set_global_opts(
tooltip_opts=opts.TooltipOpts(trigger='axis'),
xaxis_opts=opts.AxisOpts(type_='category', name=x_name,
axislabel_opts=opts.LabelOpts(font_family="宋体", font_size=font_size,
color="black"),
splitline_opts=opts.SplitLineOpts(is_show=False),
name_textstyle_opts=opts.TextStyleOpts(font_family="宋体", font_size=font_size,
color="black"),
),
yaxis_opts=opts.AxisOpts(type_='value', name=y_name,
axislabel_opts=opts.LabelOpts(font_family="宋体", font_size=font_size,
color="black", formatter="{value}%" if pct else "{value}"),
splitline_opts=opts.SplitLineOpts(is_show=False),
name_textstyle_opts=opts.TextStyleOpts(font_family="宋体", font_size=font_size,
color="black"),
axisline_opts=opts.AxisLineOpts(is_show=True),
axistick_opts=opts.AxisTickOpts(is_show=True),
),
legend_opts=opts.LegendOpts(pos_bottom='0%', pos_left='center',
textstyle_opts=opts.TextStyleOpts(
font_family='宋体',
font_size=font_size,
color='black',
),
),
)
head_path = f'plots/{file_name}'
if png:
make_snapshot(
snapshot,
plot.render(f'{head_path}.html'),
f'{head_path}.png'
)
else:
plot.render(f'{head_path}.html')
补充说明
方法对传入的DataFrame数据df
的要求为:横轴对应index,维度对应column,纵轴对应value。如下面这个df按示例传入方法后,可以得到一个二维的堆叠柱状图。
Python
import pandas as pd
from utils import pyecharts_plot as pp
# 示例数据
data = {
'category': ['A', 'B', 'C', 'D', 'E'], # 柱形的类别(x轴)
'value1': [10, 15, 13, 17, 21], # 第一组堆叠数据
'value2': [20, 18, 23, 15, 12] # 第二组堆叠数据
}
df = pd.DataFrame(data)
df.set_index('category', inplace=True) # 把category列设为index
# 传入示例
pp(df, x_name='类型', y_name='大小', file_name='示例堆叠柱形图', plot_type='stacked')