编写了一个基于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')