赞
踩
pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒。
pyecharts的github地址在这里:https://github.com/pyecharts/pyecharts
python3.6版本以上就能使用V1版本了,并且V1和V0.5x版本不兼容(V0.5x版本已不再维护),所以我这边直接装的V1以上版本
pip安装
sudo pip install pyecharts -U
pyecharts做出的图是以html格式保存的,如果想以图片的形式进行保存,还需要装下面的库和插件:
用于保存图片
pip安装
sudo pip3.7 install snapshot_selenium
因为我使用的是chrome浏览器,所以就装的chromedriver,其他浏览器也有相应的webdriver
如果装了谷歌浏览器,那输入下面命令:
google-chrome -version
然后可以看到对应的谷歌版本,比如我就是Google Chrome 69.0.3497.92
,然后就可以下载对应的版本了http://npm.taobao.org/mirrors/chromedriver/,点一个版本进去,然后里面有一个notes.txt文件,上面会显示该driver版本适用于哪些版本的浏览器,找到符合自己的,下载即可
比如我,是2.42版本:
wget -N http://chromedriver.storage.googleapis.com/2.42/chromedriver_linux64.zip
将下载下来的压缩包解压,然后输入以下:
sudo mv chromedriver /usr/bin
ll /usr/bin/chromedriver
ok了
先试跑一下github上给出的代码。
也就是这一份:
from pyecharts.charts import Bar
from pyecharts import options as opts
# V1 版本开始支持链式调用
bar = (
Bar()
.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
.set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))
)
bar.render()
会生成一个html文件,浏览器打开后,如下所示:
(关于Ubuntu下如何录制gif动图:https://blog.csdn.net/qq_41433316/article/details/103917149)
下面是生成图片的demo:
from snapshot_selenium import snapshot as driver from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.render import make_snapshot def bar_chart() -> Bar: c = ( Bar() .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"]) .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105]) .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49]) .reversal_axis() .set_series_opts(label_opts=opts.LabelOpts(position="right")) .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片")) ) return c # 需要安装 snapshot-selenium 或者 snapshot-phantomjs make_snapshot(driver, bar_chart().render(), "bar.png")
Demo看完后,下面就是进一步的学习了
先给出学习教程:https://pyecharts.org/#/zh-cn/
以及要知晓pyecharts给出的图表类型:
名称 | 说明 | 名称 | 说明 | 名称 | 说明 |
---|---|---|---|---|---|
Bar | 柱状图/条形图 | Bar3D | 3D 柱状图 | Boxplot | 箱形图 |
EffectScatter | 带有涟漪特效动画的散点图 | Funnel | 漏斗图 | Gauge | 仪表盘 |
Geo | 地理坐标系 | Graph | 关系图 | HeatMap | 热力图 |
Kline | K线图 | Line | 折线/面积图 | Line3D | 3D 折线图 |
Liquid | 水球图 | Map | 地图 | Parallel | 平行坐标系 |
Pie | 饼图 | Polar | 极坐标系 | Radar | 雷达图 |
Sankey | 桑基图 | Scatter | 散点图 | Scatter3D | 3D 散点图 |
ThemeRiver | 主题河流图 | WordCloud | 词云图 |
此外,用户可自定义图表类型:
新增X轴数据:
def add_xaxis(
# X 轴数据项
xaxis_data: Sequence
)
新增Y轴数据:
def add_yaxis( # 系列名称,用于 tooltip 的显示,legend 的图例筛选。 series_name: str, # 系列数据 yaxis_data: Sequence[Numeric, opts.BarItem, dict], # 是否选中图例 is_selected: bool = True, # 使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。 xaxis_index: Optional[Numeric] = None, # 使用的 y 轴的 index,在单个图表实例中存在多个 y 轴的时候有用。 yaxis_index: Optional[Numeric] = None, # 系列 label 颜色 color: Optional[str] = None, # 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。 stack: Optional[str] = None, # 同一系列的柱间距离,默认为类目间距的 20%,可设固定值 category_gap: Union[Numeric, str] = "20%", # 不同系列的柱间距离,为百分比(如 '30%',表示柱子宽度的 30%)。 # 如果想要两个系列的柱子重叠,可以设置 gap 为 '-100%'。这在用柱子做背景的时候有用。 gap: Optional[str] = None, # 标签配置项,参考 `series_options.LabelOpts` label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(), # 标记点配置项,参考 `series_options.MarkPointOpts` markpoint_opts: Union[opts.MarkPointOpts, dict, None] = None, # 标记线配置项,参考 `series_options.MarkLineOpts` markline_opts: Union[opts.MarkLineOpts, dict, None] = None, # 提示框组件配置项,参考 `series_options.TooltipOpts` tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, # 图元样式配置项,参考 `series_options.ItemStyleOpts` itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None, )
def set_global_opts 全局配置设置
鉴于那个教程里面写的很全,所以这边我只贴几个我觉得可能比较常用的:
首先是导入的模块:
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
#pyecharts提供的数据,用自己数据作图可不导入该模块:
from pyecharts.faker import Faker
# 如果要保存为图片:
from snapshot_selenium import snapshot as driver
from pyecharts.render import make_snapshot
def bar_base() -> Bar:
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
)
return c
bar_base().render('基本示例.html')
结果图就是demo的结果
def bar_base_with_custom_background_image() -> Bar: c = ( Bar( init_opts=opts.InitOpts( bg_color={ "type": "pattern", "image": JsCode("img"), "repeat": "no-repeat", } ) ) .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values()) .add_yaxis("商家B", Faker.values()) .set_global_opts( title_opts=opts.TitleOpts( title="Bar-背景图基本示例", subtitle="我是副标题", title_textstyle_opts=opts.TextStyleOpts(color="white"), ) ) ) c.add_js_funcs( #这里不是注释,不能去掉 """ var img = new Image(); img.src = 'background.jpg'; """ ) return c bar_base_with_custom_background_image().render('背景图.html')
def bar_same_series_gap() -> Bar:
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), category_gap="80%")
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-单系列柱间距离"))
)
return c
bar_same_series_gap().render('单系距离.html')
def bar_different_series_gap() -> Bar:
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), gap="0%")
.add_yaxis("商家B", Faker.values(), gap="0%")
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-不同系列柱间距离"),
)
)
return c
bar_different_series_gap().render('不同系列柱间距离.html')
def bar_yaxis_formatter() -> Bar:
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-Y 轴 formatter"),
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value} /月")
),
)
)
return c
bar_yaxis_formatter().render('Y 轴 formatter.html')
def bar_xyaxis_name() -> Bar:
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-XY 轴名称"),
yaxis_opts=opts.AxisOpts(name="我是 Y 轴"),
xaxis_opts=opts.AxisOpts(name="我是 X 轴"),
)
)
return c
bar_xyaxis_name().render('XY名称.html')
def bar_reversal_axis() -> Bar:
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-翻转 XY 轴"))
)
return c
bar_reversal_axis().render('XY轴翻转.html')
def bar_stack0() -> Bar:
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), stack="stack1")
.add_yaxis("商家B", Faker.values(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)"))
)
return c
bar_stack0().render('堆叠.html')
def bar_rorate_xaxis_label() -> Bar: c = ( Bar() .add_xaxis( [ "名字很长的X轴标签1", "名字很长的X轴标签2", "名字很长的X轴标签3", "名字很长的X轴标签4", "名字很长的X轴标签5", "名字很长的X轴标签6", ] ) .add_yaxis("商家A", [10, 20, 30, 40, 50, 40]) .add_yaxis("商家B", [20, 10, 40, 30, 40, 50]) .set_global_opts( xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), title_opts=opts.TitleOpts(title="Bar-旋转X轴标签", subtitle="解决标签名字过长的问题"), ) ) return c bar_rorate_xaxis_label().render('旋转X轴标签.html')
其余很多有意思的柱状图显示看教程
主要看add_yaxis函数,如下:
def add_yaxis( # 系列名称,用于 tooltip 的显示,legend 的图例筛选。 series_name: str, # 系列数据 y_axis: Sequence, # 是否选中图例 is_selected: bool = True, # 是否连接空数据,空数据使用 `None` 填充 is_connect_nones: bool = False, # 使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。 xaxis_index: Optional[Numeric] = None, # 使用的 y 轴的 index,在单个图表实例中存在多个 y 轴的时候有用。 yaxis_index: Optional[Numeric] = None, # 系列 label 颜色 color: Optional[str] = None, # 是否显示 symbol, 如果 false 则只有在 tooltip hover 的时候显示。 is_symbol_show: bool = True, # 标记的图形。 # ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', # 'diamond', 'pin', 'arrow', 'none' # 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。 symbol: Optional[str] = None, # 标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高, # 例如 [20, 10] 表示标记宽为 20,高为 10。 symbol_size: Union[Numeric, Sequence] = 4, # 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。 stack: Optional[str] = None, # 是否平滑曲线 is_smooth: bool = False, # 是否显示成阶梯图 is_step: bool = False, # 是否开启 hover 在拐点标志上的提示动画效果。 is_hover_animation: bool = True, # 标记点配置项,参考 `series_options.MarkPointOpts` markpoint_opts: Union[opts.MarkPointOpts, dict, None] = None, # 标记线配置项,参考 `series_options.MarkLineOpts` markline_opts: Union[opts.MarkLineOpts, dict, None] = None, # 提示框组件配置项,参考 `series_options.TooltipOpts` tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, # 标签配置项,参考 `series_options.LabelOpts` label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(), # 线样式配置项,参考 `series_options.LineStyleOpts` linestyle_opts: Union[opts.LineStyleOpts, dict] = opts.LineStyleOpts(), # 填充区域配置项,参考 `series_options.AreaStyleOpts` areastyle_opts: Union[opts.AreaStyleOpts, dict] = opts.AreaStyleOpts(), # 图元样式配置项,参考 `series_options.ItemStyleOpts` itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None, )
首先还是模块的导入:
import pyecharts.options as opts
from pyecharts.charts import Line
#如果想用它自己提供的数据:
from pyecharts.faker import Faker
# 如果要保存为图片:
from snapshot_selenium import snapshot as driver
from pyecharts.render import make_snapshot
然后给出一些我觉得用的多一点的:
def line_base() -> Line:
c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="Line-基本示例"))
)
return c
line_base().render('基本示例.html')
def line_xaxis_type() -> Line:
c = (
Line()
.add_xaxis(Faker.values())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Line-数值 X 轴"),
xaxis_opts=opts.AxisOpts(type_="value"),
)
)
return c
def line_smooth() -> Line:
c = (
Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), is_smooth=True)
.add_yaxis("商家B", Faker.values(), is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(title="Line-smooth"))
)
return c
line_smooth().render('平滑曲线.html')
def line_areastyle_boundary_gap() -> Line: c = ( Line() .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values(), is_smooth=True) .add_yaxis("商家B", Faker.values(), is_smooth=True) .set_series_opts( areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( title_opts=opts.TitleOpts(title="Line-面积图(紧贴 Y 轴)"), xaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_align_with_label=True), is_scale=False, boundary_gap=False, ), ) ) return c line_areastyle_boundary_gap().render('面积图.html')
def line_markpoint() -> Line: c = ( Line() .add_xaxis(Faker.choose()) .add_yaxis( "商家A", Faker.values(), markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]), ) .add_yaxis( "商家B", Faker.values(), markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]), ) .set_global_opts(title_opts=opts.TitleOpts(title="Line-MarkPoint")) ) return c line_markpoint().render('标记点.html')
def line_markpoint_custom() -> Line: x, y = Faker.choose(), Faker.values() c = ( Line() .add_xaxis(x) .add_yaxis( "商家A", y, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(name="自定义标记点", coord=[x[2], y[2]], value=y[2])] ), ) .set_global_opts(title_opts=opts.TitleOpts(title="Line-MarkPoint(自定义)")) ) return c line_markpoint_custom().render('自定义标记点.html')
def line_markline() -> Line: c = ( Line() .add_xaxis(Faker.choose()) .add_yaxis( "商家A", Faker.values(), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]), ) .add_yaxis( "商家B", Faker.values(), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]), ) .set_global_opts(title_opts=opts.TitleOpts(title="Line-MarkLine")) ) return c line_markline().render('标记行.html')
主要看add_yaxis()函数,如下:
def add_yaxis( # 系列名称,用于 tooltip 的显示,legend 的图例筛选。 series_name: str, # 系列数据 y_axis: Sequence, # 是否选中图例 is_selected: bool = True, # 使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。 xaxis_index: Optional[Numeric] = None, # 使用的 y 轴的 index,在单个图表实例中存在多个 y 轴的时候有用。 yaxis_index: Optional[Numeric] = None, # 系列 label 颜色 color: Optional[str] = None, # 标记的图形。 # ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', # 'diamond', 'pin', 'arrow', 'none' # 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。 symbol: Optional[str] = None, # 标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高, # 例如 [20, 10] 表示标记宽为 20,高为 10。 symbol_size: Numeric = 10, # 标记的旋转角度。注意在 markLine 中当 symbol 为 'arrow' 时会忽略 symbolRotate 强制设置为切线的角度。 symbol_rotate: types.Optional[types.Numeric] = None, # 标签配置项,参考 `series_options.LabelOpts` label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(position="right"), # 标记点配置项,参考 `series_options.MarkPointOpts` markpoint_opts: Union[opts.MarkPointOpts, dict, None] = None, # 标记线配置项,参考 `series_options.MarkLineOpts` markline_opts: Union[opts.MarkLineOpts, dict, None] = None, # 提示框组件配置项,参考 `series_options.TooltipOpts` tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, # 图元样式配置项,参考 `series_options.ItemStyleOpts` itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None, )
首先是导入的模块:
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.commons.utils import JsCode
#pyecharts提供的数据,用自己数据作图可不导入该模块:
from pyecharts.faker import Faker
# 如果要保存为图片:
from snapshot_selenium import snapshot as driver
from pyecharts.render import make_snapshot
下面是几个个人认为常用的:
def scatter_base() -> Scatter:
c = (
Scatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts(title="Scatter-基本示例"))
)
return c
scatter_base().render('基本示例.html')
def scatter_visualmap_color() -> Scatter:
c = (
Scatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-VisualMap(Color)"),
visualmap_opts=opts.VisualMapOpts(max_=150),
)
)
return c
scatter_visualmap_color().render('VisualMap.html')
def scatter_visualmap_size() -> Scatter:
c = (
Scatter()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-VisualMap(Size)"),
visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
)
)
return c
scatter_visualmap_size().render('VisualMap_size.html')
主要用到的函数是add函数,如下:
def add( # 系列名称,用于 tooltip 的显示,legend 的图例筛选。 series_name: str, # 系列数据项,格式为 [(key1, value1), (key2, value2)] data_pair: Sequence, # 系列 label 颜色 color: Optional[str] = None, # 饼图的半径,数组的第一项是内半径,第二项是外半径 # 默认设置成百分比,相对于容器高宽中较小的一项的一半 radius: Optional[Sequence] = None, # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标 # 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度 center: Optional[Sequence] = None, # 是否展示成南丁格尔图,通过半径区分数据大小,有'radius'和'area'两种模式。 # radius:扇区圆心角展现数据的百分比,半径展现数据的大小 # area:所有扇区圆心角相同,仅通过半径展现数据大小 rosetype: Optional[str] = None, # 饼图的扇区是否是顺时针排布。 is_clockwise: bool = True, # 标签配置项,参考 `series_options.LabelOpts` label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(), # 提示框组件配置项,参考 `series_options.TooltipOpts` tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, # 图元样式配置项,参考 `series_options.ItemStyleOpts` itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None, )
依旧给出几个我觉得常用的:
首先还是模块导入:
from pyecharts import options as opts
from pyecharts.charts import Pie
#如果想用它自己提供的数据:
from pyecharts.faker import Faker
# 如果要保存为图片:
from snapshot_selenium import snapshot as driver
from pyecharts.render import make_snapshot
def pie_base() -> Pie:
c = (
Pie()
.add("", [list(z) for z in zip(['草莓','芒果','葡萄','雪梨','西瓜','柠檬','车厘子'], ['132','38','88','108','146','95','142'])])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
return c
pie_base().render('基本示例.html')
def pie_set_colors() -> Pie:
c = (
Pie()
.add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-设置颜色"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
return c
pie_set_colors().render('颜色设置.html')
def pie_position() -> Pie: c = ( Pie() .add( "", [list(z) for z in zip(Faker.choose(), Faker.values())], center=["35%", "50%"], ) .set_global_opts( title_opts=opts.TitleOpts(title="Pie-调整位置"), legend_opts=opts.LegendOpts(pos_left="15%"), ) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) ) return c pie_position().render('调整位置.html')
def pie_radius() -> Pie: c = ( Pie() .add( "", [list(z) for z in zip(Faker.choose(), Faker.values())], radius=["40%", "75%"], #分别为内半径和外半径占比 ) .set_global_opts( title_opts=opts.TitleOpts(title="Pie-Radius"), legend_opts=opts.LegendOpts( orient="vertical", pos_top="15%", pos_left="2%" ), ) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) ) return c pie_radius().render('半径修改.html')
def pie_rosetype() -> Pie: v = Faker.choose() c = ( # 有两种形式: # radius:扇区圆心角展现数据的百分比,半径展现数据的大小 # area:所有扇区圆心角相同,仅通过半径展现数据大小 Pie() .add( "", [list(z) for z in zip(v, Faker.values())], radius=["30%", "65%"], center=["25%", "50%"], rosetype="radius", ) .add( "", [list(z) for z in zip(v, Faker.values())], radius=["30%", "65%"], center=["75%", "50%"], rosetype="area", ) .set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰图示例")) ) return c pie_rosetype().render('玫瑰图.html')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。