跳转至

echarts

pybar

from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Grid, Kline
from pyecharts.globals import ThemeType

xdata = [1, 2, 3, 4, 5, 6,7,8,9,10,11,12,13,14,15]
ydata = [1, 2, 3, 3, 2, 1,7,8,9,10,11,12,13,14,15]



bar=Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT, width='800px', height='500px'))

bar.add_xaxis(xdata)
bar.add_yaxis("主动", ydata, z=0)
bar.set_colors(["#FF3030", "#0000FF"])
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar.set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="cross"),
        title_opts=opts.TitleOpts(title="主动买卖(日线)", pos_left="left", title_textstyle_opts={"fontSize": "15"},
                                  padding=[30, 5]),
        datazoom_opts=opts.DataZoomOpts(range_start=None, range_end=None,
                                        start_value=len(xdata) - 7,
                                        end_value=len(xdata) - 1,),  # type_="inside",
        xaxis_opts=opts.AxisOpts(axislabel_opts={"interval": "0", "rotate": "-0", "fontSize": "8"}),
        yaxis_opts=opts.AxisOpts(axislabel_opts={"fontSize": "8"}),
        legend_opts=opts.LegendOpts(pos_left="center", padding=[30, 5]),
    )
bar.render("pybar.html")

# 链式编程
# bar = (
#     Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT, width='370px', height='250px'))
#         .add_xaxis(xdata)
#         .add_yaxis("主动", ydata, z=0)
#         .set_colors(["#FF3030", "#0000FF"])
#         .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
#         .set_global_opts(
#         tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="cross"),
#         title_opts=opts.TitleOpts(title="主动买卖(日线)", pos_left="left", title_textstyle_opts={"fontSize": "15"},
#                                   padding=[30, 5]),
#         datazoom_opts=opts.DataZoomOpts(range_start=None, range_end=None,
#                                         start_value=len(xdata) - 7,
#                                         end_value=len(xdata) - 1,),  # type_="inside",
#         xaxis_opts=opts.AxisOpts(axislabel_opts={"interval": "0", "rotate": "-0", "fontSize": "8"}),
#         yaxis_opts=opts.AxisOpts(axislabel_opts={"fontSize": "8"}),
#         legend_opts=opts.LegendOpts(pos_left="center", padding=[30, 5]),
#     )
#         .render("pybar.html")
# )

pyline

from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Grid, Kline
from pyecharts.globals import ThemeType
import re
from flask_sqlalchemy import SQLAlchemy

from flask import Flask, jsonify, request, jsonify,render_template
# from snapshot_phantomjs import snapshot
from snapshot_selenium import snapshot
from pyecharts.render import make_snapshot

xdata = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'markl', '12', '13', '14', '15', '16']
ydata = [3, 2, 3, 3, 2, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ydata2 = [3, 5, 8, 9, 8, 6, 4, 3, 1, 7, 8, 9, 10, 13, 16]

# 创建一个Line并且进行初始化设置
line = Line(
    init_opts=opts.InitOpts(
        # 图表主题风格,可以依赖于from pyecharts.globals import
        # ThemeType,库里自带的一些风格,如ThemeType.LIGHT,当然也可以直接写"white"|"dark"
        theme=ThemeType.LIGHT,
        # 图的宽度和高度
        width='800px',
        height='500px',
        # 图的ID,图表唯一标识,用于在多图表时区分。一般用不着。Optional[str]
        chart_id=None,
        # 显示在浏览器标签栏上的名字,可以选择自己需要的名字
        page_title="这里是网页标题",
        # 图的背景色,会覆盖掉theme设置的主题的背景色
        bg_color='#F3F3F3',
        # 动画效果设置
        animation_opts=opts.AnimationOpts(
            # 是否开启动画,默认开启
            animation=True,
            # Numeric,是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。默认 2000。
            animation_threshold=2000,
            # Union[Numeric, JSFunc] 初始动画的时长,默认值为 1000。
            # 支持回调函数,可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果:
            animation_duration=1000,
            ##################################这部分没啥用,也找不到参考资料,暂时不用#######################################
            # Union[str] 初始动画的缓动效果。
            # bounceOut|cubicOut。
            animation_easing="cubicOut",
            # Union[Numeric, JSFunc] 初始动画的延迟,默认值为 0。单位是毫秒1000
            # 支持回调函数,可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
            animation_delay=0,
            # Union[Numeric, JSFunc] 数据更新动画的时长,默认值为 300。
            # 支持回调函数,可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果:
            animation_duration_update=300,
            # : Union[Numeric] 数据更新动画的缓动效果。
            # 不同的缓动效果可以参考,缓动示例 (https://www.echartsjs.com/gallery/editor.html?c=line-easing)。
            animation_easing_update="cubicOut",
            # Union[Numeric, JSFunc] 数据更新动画的延迟,默认值为 0。
            # 支持回调函数,可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
            animation_delay_update=0,
            ###############################################################################
        )
    ),
)

# 添加x轴序列
# xdata = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
# xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
# xdata = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
# xdata=[6,5,4,3,2,1]
# ydata=[1,2,3,4,5,6]

# 1.xdata的list里的内容,如果是int类型,那么从0开始才会从第一格开始画图,如果是从1开始,就会从第二个开始画图,如果是从2开始,就会从第三格开始画图
# 若要从2开始,还想从1开始画图,那么就需要str类型
# 另外,如果xdata=[6,5,4,3,2,1],那么会从第二个格子开始画图,并且ydata为倒序
# 为了避免错误,xdata尽量使用字符串list
line.add_xaxis(xdata)

# 添加x轴序列
# 顺序依次为:
# 1.数据名称(显示在图上的legend(序列名称)上的名字)为""时,在legend上不显示,
# 2.ydata为y轴的数据list,
# 3.z为使用overlap叠加多图时的图层顺序,0代表在最底层,
# 4.label_opts可以设置每一个y标签的属性,选择是否显示标签,也可以在set_series_opts里一次性设置所有的标签是否显示,需要注意的是,如果在下面set_series_opts里设置label会覆盖这里的设置

# 使用非链式编程,方便for循环加载y轴多个数据:
# for i in range(len(data)):
#     line.add_yaxis("", data[i], z=i)

line.add_yaxis("ydata", ydata, z=0,
               label_opts=opts.LabelOpts(
                   # 是否显示标签,也就是序列上的点的y值
                   is_show=True,

                   #  Union[str, Sequence] 标签的位置。可选
                   # 'top','left','right','bottom','inside','insideLeft','insideRight'
                   # 'insideTop','insideBottom', 'insideTopLeft','insideBottomLeft'
                   # 'insideTopRight','insideBottomRight'
                   position="top",

                   # : Optional[str] 文字的颜色。
                   # 如果设置为 'auto',则为视觉映射得到的颜色,如系列色。默认None,可以是"#0000FF",一般可以使用默认,跟legend保持一致
                   color="#0000FF",

                   # : Union[Numeric, Sequence, None] 距离图形元素的距离。当 position 为字符描述值(如 'top'、'insideRight')时候有效。默认None
                   # 经过自己的测试,只支持类似30或者-30之类,Sequence不知道指的是什么
                   distance=None,

                   # : Numeric 文字的字体大小
                   font_size=18,

                   # : Optional[str] 文字字体的风格,可选:
                   # 'normal','italic'(字体的斜体属性,当字体本身有斜体效果的时候有效,如果该字体没斜体效果就失效),'oblique(把字倾斜,不管字体有没有斜体属性都生效)',None
                   font_style='oblique',

                   # : Optional[str] 文字字体的粗细,可选:
                   # 'normal','bold','bolder'前两个是粗,'lighter'这一个是细,None
                   font_weight='normal',

                   # : Optional[str] 文字的字体系列,使用时,小心字体侵权
                   # 还可以是 'serif' , 'monospace', 'Arial', 'Courier New', 'Microsoft YaHei', ...None
                   font_family=None,

                   # : Optional[Numeric] 标签旋转。从 -90 度到 90 度。正值是逆时针。None
                   rotate=-30,
                   # ###################这些好像无效,前面的试了没用,后面两个不会试###########################################################
                   # : Optional[Numeric] 刻度标签与轴线之间的距离。
                   # 不知道干嘛用的,我试了改完数据没反映,不知道是不是不能作用在Line上,还是跟其他设置冲突了
                   margin=8,

                   # : Union[Numeric, str, None] 坐标轴刻度标签的显示间隔,在类目轴中有效。None
                   # 默认会采用标签不重叠的策略间隔显示标签。
                   # 可以设置成 0 强制显示所有标签。
                   # 如果设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推。
                   # 可以用数值表示间隔的数据,也可以通过回调函数控制。回调函数格式如下:
                   # (index:number, value: string) => boolean
                   # 第一个参数是类目的 index,第二个值是类目名称,如果跳过则返回 false。
                   interval=None,

                   # : Optional[str] 文字水平对齐方式,默认自动。可选:
                   # 'left','center','right',None
                   horizontal_align='right',

                   # : Optional[str] 文字垂直对齐方式,默认自动。可选:
                   # 'top','middle','bottom',None
                   vertical_align='bottom',

                   # : Optional[str] 标签内容格式器,支持字符串模板和回调函数两种形式,字符串模板与回调函数返回的字符串均支持用 \n 换行。
                   # 也没测试,也不会用,不知道是不是有效果
                   formatter=None,

                   # : Optional[dict] 在 rich 里面,可以自定义富文本样式。利用富文本样式,可以在标签中做出非常丰富的效果
                   # 具体配置可以参考一下 https://www.echartsjs.com/tutorial.html#%E5%AF%8C%E6%96%87%E6%9C%AC%E6%A0%87%E7%AD%BE
                   # 好像功能很不错,不过不会用,也没试验,富文本为啥是dict格式的
                   rich=None,
                   # #######################################################################
               ),
               itemstyle_opts=opts.ItemStyleOpts(
                   # 图形的颜色。: Optional[str] None
                   # 颜色可以使用 RGB 表示,比如 'rgb(128, 128, 128)',如果想要加上 alpha 通道表示不透明度,
                   # 可以使用 RGBA,比如 'rgba(128, 128, 128, 0.5)',也可以使用十六进制格式,比如 '#ccc'。
                   # 除了纯色之外颜色也支持渐变色和纹理填充
                   #
                   # 线性渐变,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比,
                   # 如果 globalCoord 为 `true`,则该四个值是绝对的像素位置
                   # color: {
                   #    type: 'linear',
                   #    x: 0,
                   #    y: 0,
                   #    x2: 0,
                   #    y2: 1,
                   #    colorStops: [{
                   #        offset: 0, color: 'red' // 0% 处的颜色
                   #    }, {
                   #        offset: 1, color: 'blue' // 100% 处的颜色
                   #    }],
                   #    global: false // 缺省为 false
                   # }
                   #
                   # 径向渐变,前三个参数分别是圆心 x, y 和半径,取值同线性渐变
                   # color: {
                   #    type: 'radial',
                   #    x: 0.5,
                   #    y: 0.5,
                   #    r: 0.5,
                   #    colorStops: [{
                   #        offset: 0, color: 'red' // 0% 处的颜色
                   #    }, {
                   #        offset: 1, color: 'blue' // 100% 处的颜色
                   #    }],
                   #    global: false // 缺省为 false
                   # }
                   #
                   # 纹理填充
                   # color: {
                   #    image: imageDom, // 支持为 HTMLImageElement, HTMLCanvasElement,不支持路径字符串
                   #    repeat: 'repeat' // 是否平铺, 可以是 'repeat-x', 'repeat-y', 'no-repeat'
                   # }
                   color=None,

                   # 不知道阴线是什么,改了看不出来效果,有可能是用在K线一类的图里的吧
                   # : Optional[str] 阴线 图形的颜色。None
                   color0=None,

                   # 描边指的是每根线的数据点的圆圈,鼠标放上去时会放大
                   # : Optional[str] 图形的描边颜色。支持的颜色格式同 color,不支持回调函数。
                   border_color=None,

                   # : Optional[str] 阴线 图形的描边颜色。
                   border_color0=None,

                   # : Optional[Numeric] 描边宽度,默认不描边。
                   border_width=None,

                   # : Optional[str] 支持 'dashed', 'dotted'。None
                   border_type=None,

                   # : Optional[Numeric] 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。对于线好像没用,应该只能用在有面积的图里
                   opacity=None,

                   # : Optional[str] 区域的颜色。 有可能用在面积图里吧,还不确定,需要用的时候再试试
                   area_color=None,

               ),
               linestyle_opts=opts.LineStyleOpts(
                   # : bool 是否显示,这里设置没有效果
                   is_show=True,

                   # : Numeric 线宽。
                   width=1,

                   # : Numeric 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。
                   opacity=1,

                   # : Numeric 线的弯曲度,0 表示完全不弯曲,好像没效果
                   curve=0,

                   # : str 线的类型。可选:
                   # 'solid', 'dashed', 'dotted'
                   type_="solid",

                   # 线的颜色。: Union[str, Sequence, None]
                   # 颜色可以使用 RGB 表示,比如 'rgb(128, 128, 128)',如果想要加上 alpha 通道表示不透明度,
                   # 可以使用 RGBA,比如 'rgba(128, 128, 128, 0.5)',也可以使用十六进制格式,比如 '#ccc'。
                   # 除了纯色之外颜色也支持渐变色和纹理填充
                   #
                   # 线性渐变,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比,
                   # 如果 globalCoord 为 `true`,则该四个值是绝对的像素位置
                   # color: {
                   #    type: 'linear',
                   #    x: 0,
                   #    y: 0,
                   #    x2: 0,
                   #    y2: 1,
                   #    colorStops: [{
                   #        offset: 0, color: 'red' // 0% 处的颜色
                   #    }, {
                   #        offset: 1, color: 'blue' // 100% 处的颜色
                   #    }],
                   #    global: false // 缺省为 false
                   # }
                   #
                   # 径向渐变,前三个参数分别是圆心 x, y 和半径,取值同线性渐变
                   # color: {
                   #    type: 'radial',
                   #    x: 0.5,
                   #    y: 0.5,
                   #    r: 0.5,
                   #    colorStops: [{
                   #        offset: 0, color: 'red' // 0% 处的颜色
                   #    }, {
                   #        offset: 1, color: 'blue' // 100% 处的颜色
                   #    }],
                   #    global: false // 缺省为 false
                   # }
                   #
                   # 纹理填充
                   # color: {
                   #    image: imageDom, // 支持为 HTMLImageElement, HTMLCanvasElement,不支持路径字符串
                   #    repeat: 'repeat' // 是否平铺, 可以是 'repeat-x', 'repeat-y', 'no-repeat'
                   # }
                   # 这里设置线的颜色不影响描边的颜色,就是数据的那个点点
                   color=None,

               ),

                # 添加markpoint
                markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),

               # 数据是否有None 值,如果有就要设置,不然线会断
                is_connect_nones=True,

               #是否显示线上的点
                is_symbol_show=False,

               )

# 添加另外一条线做对比
line.add_yaxis("ydata2", ydata2, z=1, label_opts=opts.LabelOpts(is_show=False, ), )

# 在不满足默认风格时,自己设置序列的颜色,overlap时同样有效,会覆盖在ydata里设置过的颜色
# line.set_colors(
#     ["#FF3030", "#0000FF"],
# )

line.set_series_opts(
    # label_opts=opts.LabelOpts(
    #     is_show=False
    # ),

    markline_opts=opts.MarkLineOpts(

        # : bool 图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件。
        is_silent=True,

        # 标记线数据,x可以等于具体的第几个数据,类型为int,也可以为x轴的具体数据,类型为str,用什么lable就显示什么
        data=[opts.MarkLineItem(x='markl'), opts.MarkLineItem(x='7')],

        # : Optional[str] 标线两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定,具体格式见 data.symbol。
        # symbol 的几种样式 :默认["circle","arrow"]。circle圆 | rect长方 | roundRect圆长方 | triangle三角 | diamond菱形 | pin大头针 | arrow箭头 | none没有
        symbol=[None, None],

        # : Union[None, Numeric] 标线两端的标记大小,可以是一个数组分别指定两端,也可以是单个统一指定。
        symbol_size=0,

        # : int 标线数值的精度,在显示平均值线的时候有用。
        precision=2,

        # : LabelOpts 标签配置项,参考 `series_options.LabelOpts`
        # label_opts=opts.LabelOpts(
        #     font_size=20,
        #     rotate=-30,
        # ),

        #  利用padding可以改变markline的标签显示位置,可以直接使用示例中的写法,第三位是Y轴的偏移,第四位是X轴的偏移
        label_opts={"rotate": "-90", "fontSize": "15", "padding": [0, 0, -380, 50]},

        # : Union[LineStyleOpts, dict, None] 标记线样式配置项,参考 `series_options.LineStyleOpts`
        linestyle_opts=opts.LineStyleOpts(
            color="#FF3030",
            width=3,
        ),
    ),
    # markpoint_opts=opts.MarkPointOpts(
    #     # : Sequence[Union[MarkPointItem, dict]] 标记点数据,参考 `series_options.MarkPointItem`
    #     # data= None,
    #     data=[opts.MarkPointItem(x='9'), opts.MarkPointItem(x='10')],
    #
    #     # : Optional[str] 标记的图形。
    #     # ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle',
    #     # 'diamond', 'pin', 'arrow', 'none'
    #     # 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。
    #     symbol='diamond',
    #
    #     # : Union[None, Numeric] 标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高,
    #     # 例如 [20, 10] 表示标记宽为 20,高为 10。
    #     # 如果需要每个数据的图形大小不一样,可以设置为如下格式的回调函数:
    #     # (value: Array|number, params: Object) => number|Array
    #     # 其中第一个参数 value 为 data 中的数据值。第二个参数 params 是其它的数据项参数。
    #     # symbol_size= None,
    #     symbol_size=20,
    # ),
)

line.set_global_opts(
    tooltip_opts=opts.TooltipOpts(
        is_show=True,
        trigger="axis",
        axis_pointer_type="cross"
    ),
    title_opts=opts.TitleOpts(
        title="主动买卖(日线)",
        pos_left="left",
        title_textstyle_opts={"fontSize": "15"},
        padding=[30, 5]),
    datazoom_opts=opts.DataZoomOpts(
        range_start=None, range_end=None,
        # start_value=len(xdata) - 7,
        # end_value=len(xdata) - 1,
        # type_="inside",
    ),
    xaxis_opts=opts.AxisOpts(
        axislabel_opts={"interval": "0", "rotate": "-0", "fontSize": "8"},

        # 数据点是不是跟坐标轴的名字对齐
        axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
        is_scale=False,

        # 坐标轴两边留白策略,类目轴和非类目轴的设置和表现不一样。也就是让线定格显示
        # 类目轴中 boundaryGap 可以配置为 true 和 false。默认为 true,这时候刻度只是作为分隔线,
        # 标签和数据点都会在两个刻度之间的带(band)中间。
        # 非类目轴,包括时间,数值,对数轴,boundaryGap是一个两个值的数组,分别表示数据最小值和最大值的延伸范围
        # 可以直接设置数值或者相对的百分比,在设置 min 和 max 后无效。 示例:boundaryGap: ['20%', '20%']
        boundary_gap=False,
    ),
    yaxis_opts=opts.AxisOpts(
        axislabel_opts={"fontSize": "8"}
    ),
    legend_opts=opts.LegendOpts(
        pos_left="center",
        padding=[30, 5],
    ),
    toolbox_opts=opts.ToolboxOpts(
        is_show=False,
    )
)
def mystrip(mylist):  # 把语句中的空格和\n排除
    templist = []
    for i in range(len(mylist)):
        templist.append(re.sub('\n|\t', '', mylist[i].strip()))
    return templist






def txthtml2v(txthtml):
    def mystripstr(mystr):  # 把语句中的空格和\n排除

        outstr = re.sub('\n|\t', '', mystr.strip())
        return outstr


    qian = '<script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>'

    obj = re.compile(r'<div.*?</script>', re.S)

    div_script = obj.findall(txthtml)[0]

    objdiv=re.compile(r'<div.*?</div>', re.S)
    objscript=re.compile(r'<script.*?</script>', re.S)

    divhtml=objdiv.findall(div_script)

    objid=re.compile(r'id="(.*?)" class', re.S)
    myid=objid.findall(divhtml[0])[0]





    kebiandiv="""
    <div style="max-width: 1200px;margin: 0 auto" class="cswcsclass" >
    <script>
        const w = document.getElementsByClassName("cswcsclass")[0].clientWidth;
        document.write('<div id="""+ myid +""" class="chart-container" style="width:'+w+'px; height:'+w*0.6+'px;"></div>');
    </script>
    </div>
    """




    scripthtml = objscript.findall(div_script)

    zuizhonglist = qian + mystripstr(kebiandiv) + mystrip(scripthtml)[0]
    return zuizhonglist

# file_path = 'E:\cs'
#
# txthtml=line.render_embed()
#
#
# outht=txthtml2v(txthtml)


# f = open(file_path+'/cs.html','w')
#
#
# f.write(outht)
#
# f.close()


# app = Flask(__name__)
#
#
# @app.route("/")
# def jyck():
#     return outht
#
#
# app.run(host='172.18.20.181', port=5009)








# line.render("pyline.html")
make_snapshot(snapshot,line.render(),"cs1.jpeg")