scatter,标记点,标记线配置项

要求

表格共三列,SKU,库存天数,库存周转率, 要求根据横坐标是库存天数,纵坐标是库存周转率,各自均值划分界限,形成四象限;并且每个点对应各自的SKU

SKU库存天数库存周转率
1453.15
2704.56

散点图

# Import necessary libraries
import numpy as np
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.globals import ThemeType

# Load the data
data = pd.read_excel('库存周转率(已计算).xlsx')  

# Prepare the data for the scatter plot
x_data = data['库存天数'].tolist()
y_data = data['库存周转率'].tolist()
sku_data = data['SKU'].tolist()  

# Create the scatter plot
scatter = (
    Scatter(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(x_data)
    .add_yaxis('库存周转率', y_data)
)

scatter.set_global_opts(
    xaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存天数",
        type_="value",
        min_=0,
        max_=90
    ),
    yaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存周转率",
        type_="value",
        min_=0,
        max_=7
    ),
    visualmap_opts=opts.VisualMapOpts(type_='size', min_=1, max_=7),
    title_opts=opts.TitleOpts(title="库存天数 vs 库存周转率")
)

scatter.render_notebook()

结果:
scatter1

区域缩放配置项DataZoomOpts

class DataZoomOpts(
    # 是否显示 组件。如果设置为 false,不会显示,但是数据过滤的功能还存在。
    is_show: bool = True,

    # 组件类型,可选 "slider", "inside"
    type_: str = "slider",

    # 拖动时,是否实时更新系列的视图。如果设置为 false,则只在拖拽结束的时候更新。
    is_realtime: bool = True,

    # 数据窗口范围的起始百分比。范围是:0 ~ 100。表示 0% ~ 100%。
    range_start: Numeric = 20,

    # 数据窗口范围的结束百分比。范围是:0 ~ 100
    range_end: Numeric = 80,

    # 数据窗口范围的起始数值。如果设置了 start 则 startValue 失效。
    start_value: Union[int, str, None] = None,

    # 数据窗口范围的结束数值。如果设置了 end 则 endValue 失效。
    end_value: Union[int, str, None] = None,

    # 布局方式是横还是竖。不仅是布局方式,对于直角坐标系而言,也决定了,缺省情况控制横向数轴还是纵向数轴
    # 可选值为:'horizontal', 'vertical'
    orient: str = "horizontal",

    # 设置 dataZoom-inside 组件控制的 x 轴(即 xAxis,是直角坐标系中的概念,参见 grid)。
    # 不指定时,当 dataZoom-inside.orient 为 'horizontal'时,默认控制和 dataZoom 平行的第一个 xAxis
    # 如果是 number 表示控制一个轴,如果是 Array 表示控制多个轴。
    xaxis_index: Union[int, Sequence[int], None] = None,

    # 设置 dataZoom-inside 组件控制的 y 轴(即 yAxis,是直角坐标系中的概念,参见 grid)。
    # 不指定时,当 dataZoom-inside.orient 为 'horizontal'时,默认控制和 dataZoom 平行的第一个 yAxis
    # 如果是 number 表示控制一个轴,如果是 Array 表示控制多个轴。
    yaxis_index: Union[int, Sequence[int], None] = None,

    # 是否锁定选择区域(或叫做数据窗口)的大小。
    # 如果设置为 true 则锁定选择区域的大小,也就是说,只能平移,不能缩放。
    is_zoom_lock: bool = False,

    # dataZoom-slider 组件离容器左侧的距离。
    # left 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,
    # 也可以是 'left', 'center', 'right'。
    # 如果 left 的值为 'left', 'center', 'right',组件会根据相应的位置自动对齐。
    pos_left: Optional[str] = None,

    # dataZoom-slider 组件离容器上侧的距离。
    # top 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比,
    # 也可以是 'top', 'middle', 'bottom'。
    # 如果 top 的值为 'top', 'middle', 'bottom',组件会根据相应的位置自动对齐。
    pos_top: Optional[str] = None,

    # dataZoom-slider 组件离容器右侧的距离。
    # right 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比。
    # 默认自适应。
    pos_right: Optional[str] = None,

    # dataZoom-slider组件离容器下侧的距离。
    # bottom 的值可以是像 20 这样的具体像素值,可以是像 '20%' 这样相对于容器高宽的百分比。
    # 默认自适应。
    pos_bottom: Optional[str] = None,
)

更新散点图

# Import necessary libraries
import numpy as np
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.globals import ThemeType

# Load the data
data = pd.read_excel('库存周转率(已计算).xlsx')  

# Prepare the data for the scatter plot
x_data = data['库存天数'].tolist()
y_data = data['库存周转率'].tolist()
sku_data = data['SKU'].tolist()  

# Create the scatter plot
scatter = (
    Scatter(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(x_data)
    .add_yaxis('库存周转率', y_data)
)

scatter.set_global_opts(
    xaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存天数",
        type_="value",
        min_=0,
        max_=90
    ),
    yaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存周转率",
        type_="value",
        min_=0,
        max_=7
    ),
    visualmap_opts=opts.VisualMapOpts(type_='color', min_=1, max_=7),
    title_opts=opts.TitleOpts(title="库存天数 vs 库存周转率"),
    datazoom_opts=opts.DataZoomOpts(
        range_start=0,
        range_end=100
    ),
)

scatter.render_notebook()

out:
scatter2
局部放大以后,重合的点还是重合的,绝望
sctter3

标识线

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

    # 标记线数据,参考 `series_options.MarkLineItem`
    data: Sequence[Union[MarkLineItem, dict]] = None,

    # 标线两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定,具体格式见 data.symbol。
    symbol: Optional[str] = None,

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

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

    # 标签配置项,参考 `series_options.LabelOpts`
    label_opts: LabelOpts = LabelOpts(),

    # 标记线样式配置项,参考 `series_options.LineStyleOpts`
    linestyle_opts: Union[LineStyleOpts, dict, None] = None,
)


scatter.set_series_opts(
    markline_opts=opts.MarkLineOpts(
        data=[
            opts.MarkLineItem(type_='average', x=x_midpoint, symbol='arrow'),
            opts.MarkLineItem(type_='average', y=y_midpoint, symbol='arrow')
        ]
    )
)

scatter-标识线
完整代码:

# Import necessary libraries
import numpy as np
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.globals import ThemeType

# Load the data
data = pd.read_excel('库存周转率(已计算).xlsx')  

# Prepare the data for the scatter plot
x_data = data['库存天数'].tolist()
y_data = data['库存周转率'].tolist()
sku_data = data['SKU'].tolist()  

# Calculate the midpoints for each axis
x_midpoint = sum(x_data) / len(x_data)
y_midpoint = sum(y_data) / len(y_data)

# Create the scatter plot
scatter = (
    Scatter(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(x_data)
    .add_yaxis('库存周转率', y_data)
)

scatter.set_global_opts(
    xaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存天数",
        type_="value",
        min_=20,
        max_=90
    ),
    yaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存周转率",
        type_="value",
        min_=0,
        max_=7
    ),
    visualmap_opts=opts.VisualMapOpts(type_='color', min_=1, max_=7),
    title_opts=opts.TitleOpts(title="库存天数 vs 库存周转率"),
    datazoom_opts=opts.DataZoomOpts(
        range_start=0,
        range_end=100
    ),
)

scatter.set_series_opts(
    markline_opts=opts.MarkLineOpts(
        data=[
            opts.MarkLineItem(type_='average', x=x_midpoint, symbol='arrow'),
            opts.MarkLineItem(type_='average', y=y_midpoint, symbol='arrow')
        ]
    )
)

scatter.render_notebook()

标识点

class MarkPointItem(
    # 标注名称。
    name: Optional[str] = None,

    # 特殊的标注类型,用于标注最大值最小值等。可选:
    # 'min' 最大值。
    # 'max' 最大值。
    # 'average' 平均值。
    type_: Optional[str] = None,

    # 在使用 type 时有效,用于指定在哪个维度上指定最大值最小值,可以是 
    # 0(xAxis, radiusAxis),
    # 1(yAxis, angleAxis),默认使用第一个数值轴所在的维度。
    value_index: Optional[Numeric] = None,

    # 在使用 type 时有效,用于指定在哪个维度上指定最大值最小值。这可以是维度的直接名称,
    # 例如折线图时可以是 x、angle 等、candlestick 图时可以是 open、close 等维度名称。
    value_dim: Optional[str] = None,

    # 标注的坐标。坐标格式视系列的坐标系而定,可以是直角坐标系上的 x, y,
    # 也可以是极坐标系上的 radius, angle。例如 [121, 2323]、['aa', 998]。
    coord: Optional[Sequence] = None,

    # 相对容器的屏幕 x 坐标,单位像素。
    x: Optional[Numeric] = None,

    # 相对容器的屏幕 y 坐标,单位像素。
    y: Optional[Numeric] = None,

    # 标注值,可以不设。
    value: Optional[Numeric] = 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: Union[Numeric, Sequence] = None,

    # 标记点样式配置项,参考 `series_options.ItemStyleOpts`
    itemstyle_opts: Union[ItemStyleOpts, dict, None] = None,
)


# Import necessary libraries
import numpy as np
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Scatter
from pyecharts.globals import ThemeType

# Load the data
data = pd.read_excel('库存周转率(已计算).xlsx')  

# Prepare the data for the scatter plot
x_data = data['库存天数'].tolist()
y_data = data['库存周转率'].tolist()
sku_data = data['SKU'].tolist()  

# Calculate the midpoints for each axis
x_midpoint = sum(x_data) / len(x_data)
y_midpoint = sum(y_data) / len(y_data)

# Create the scatter plot
scatter = (
    Scatter(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(x_data)
    .add_yaxis('库存周转率', y_data, label_opts=opts.LabelOpts(is_show=False))
)

scatter.set_global_opts(
    xaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存天数",
        type_="value",
        min_=20,
        max_=90
    ),
    yaxis_opts=opts.AxisOpts(
        splitline_opts=opts.SplitLineOpts(is_show=True),
        name="库存周转率",
        type_="value",
        min_=0,
        max_=7
    ),
    visualmap_opts=opts.VisualMapOpts(type_='size', min_=1, max_=7),
    title_opts=opts.TitleOpts(title="库存天数 vs 库存周转率"),
    datazoom_opts=opts.DataZoomOpts(
        range_start=0,
        range_end=100
    ),
)

scatter.set_series_opts(
    markline_opts=opts.MarkLineOpts(
        data=[
            opts.MarkLineItem(type_='average', x=x_midpoint, symbol='arrow'),
            opts.MarkLineItem(type_='average', y=y_midpoint, symbol='arrow')
        ]
    ),
    markpoint_opts=opts.MarkPointOpts(
        data=[
            opts.MarkPointItem(
                coord=[x,y],
                name=sku,
                value=sku,
                symbol_size=50,
                itemstyle_opts=opts.ItemStyleOpts(color='rgba(255, 127, 80, 0.6)')
            )
            for x,y,sku in zip(x_data, y_data, sku_data)
        ]
    )
)

scatter.render_notebook()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值