npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

mycharts

v0.0.4

Published

SVG Chart with Server-side Rendering

Downloads

4

Readme

mycharts

MyCharts 是一个既可以在浏览器里绘制,也可以在服务器渲染(SSR)的 SVG 图表库。

Run Demo:

# 推荐用 node 16+
yarn dev

Run Build:

yarn build

CSS Import:

@import 'mycharts/dist/client/theme.css';

使用 mycharts 生成图表的示例:

import chart from 'mycharts';

// 另:直接引入esm文件
import chart from 'mycharts/dist/client/mycharts.esm';

/***
 * @data 是跟数据的配置项,数据类型较多会在后文Data API中详细说明
 */
const data = {
    type // 下文图表中的一种 如 pie
    ...//详见下文Data API
}

/***
 * @config 可选,是跟交互有关的配置项,一般跟图表本身的绘制没有关系
 * 注:config如果是string类型的话就设为id了
 */
const config = {
    id: 'chart_' + (new Date()).getTime(), // whatever
    insertSSRData: true, //如果设成false,ssr时将不再在图表内存入data
    debug: false, // 如果需要观察运行时间 set it to true
    errorMessage: '暂无数据', // 可选,渲染失败时模块错误提示
    // 图表的盒模型--以下为默认配置
    box: {
        height: 170,
        width: 360,
        padding: 15,// 左右边距
        left: 'auto',// 自动计算左坐标轴缩进
        bottom: 18,
        right: 0,
        top: 12,
    },
    // csr渲染及交互配置项
    parent, // selector/node - 图表的父节点
    insertType, // string - 渲染方式,insert(默认)或append
    //启用动画:bool/object: 默认值false, 如果为true则默认如下
    animation: {
        duration: 200,
        delay: 0,
    }
    // 跟交互有关的配置
    interaction: {
        custom, // bool 如果设为true,后面的设置全失效
        callback,// 图表(不含legend)发生touch/click后的callback
        tooltip: {
            delay: 2000, // 可选,延迟2000ms出现
            insertType: 'append', // 可选prepend
            selected: 2, // 选中条目:可以覆盖data里的pointIndex,Map类型里是对应的条目的名称
            trigger: false, // 是否在初始化时显示tooltip
            moveTrigger: true, // 鼠标touch移动是否触发
            preventEmpty: false, // 为true时,无信息的区域无法交互
            hide: false, // TODO: 若为true则不在交互区域点击隐藏
            align: 'auto', // TODO: center/left/right/auto
            content: undefined, // 用来替换tooltip的内容, 支持string, dom, function
        },
        legend: {
            show: true, // 若设为false,不展示(line&radar)
            selected: [],// 不传为all, 传legendname
            canUnselectAll: false, // 如果为ture, 则可全部不选
            callback,
            clickable // boolean | function 如果返回值为false则点击失效(from 1.3.7)
        },
        // 以下是Map专用
        // source实际上是注入自定义的数据,它会查找data中features里符合条件的条目注入数据
        source: {
            key: 'name', // 默认值
            '北京': { popular: 3000 } // 这将会为features里properties的name为“北京”的条目注入数据“{ popular: 3000 }”
        }
        // style可以定制一些地图特有的样式,其中function会提供该区域的source数据
        style: {
            colorize, // function或色值:区域对应的颜色
            textColor, // function或色值:区域名称字体的颜色
            textSize, // function或字号:区域名称字体大小
            textTranslate // function或偏移量[x, y]:区域名称的位移(因为区域小可能文字重合)
        }
    }
}

//获取图表对象
let chartObj = chart.pie(data[, config]);

//渲染图表
/**
 * 两个参数会覆盖config中同名参数
 * @parent - selector/node - 图表的父节点
 * @insertType - string - 渲染方式,insert(默认)或append
*/
chartObj.render([parent, insertType])

//ssr渲染的图表实现交互
/**
 * 参数nodeOrId为需要实现交互的节点(class包含'my-charts'这级),或者图表id
 * 第二个参数可选,传入{data, config}将会替代ssr传递过来的参数,设定此值可以在ssr时将insertSSRData设为false节省ssr带来的庞大体积
*/
chart.hydrate(nodeOrId[, { data, config }])

Data API:

提示:启动 demo 查看控制台看到的 API 最为完整。

Radar Chart:

  chart(data[, config])
  • data example
  {
      "indicator": [{
                  "name": "销售\n4300",
                  "max": 6500
              },
              {
                  "name": "管理\n2500",
                  "max": 16000
              },
              {
                  "name": "其他\n2500",
                  "max": 16000
              }
      ],
      "style" : {
          "curve": 1, // 0~1, 1是圆弧,0是折线
          "axisCurve": 1
      },
      "series": [{
          "name": "预算 vs 开销(Budget vs spending)",
          "data": [{
                  "value": [
                      4300,
                      10000,
                      2000
                  ],
                  "name": "预算分配(Allocated Budget)"
              },
              {
                  "value": [
                      5000,
                      14000,
                      100
                  ],
                  "name": "实际开销(Actual Spending)",
                  "lineStyle": {
                      "normal": {
                          "color": "#10df67" // 线条颜色
                      },
                      "area": {
                          "opacity": 0 // 内部area透明度
                      }
                  }
              }
          ]
      }]
  }

Pie Chart:

  chart.pie(data[, config])
  • data example
  {
      "value": [46.6, 38.9, 14.6],
      "color": ['#FF574D', '#3E8FF1', '#2BC7FF'],
      /* not required */
      "name": ['type 1', 'type 2', 'type 3'],
      /* not required */
      "unit": '%',
      /* not required 隐藏提示(指针) */
      "hideLabel": false,
      /* not required 隐藏中间部分的提示 */
      "hideCenterLabel": false,
      /* not required label的一些样式定制,兼容性不保证 */
      "labelStyle": {
          "showIcon": true,
          /* label末尾加⭕️ */
          "splitText": true /* label分行 */
          "color": ['#FF574D', '#3E8FF1', '#2BC7FF'],
          "lineScale": 1.5,
          /* label折线的长度缩放倍数 */
          "size": 2 /* label展示数量 */
      },
      /* not required centerlabel的一些样式定制 */
      "centerLabelStyle": {
          "insertType": "prepend", // 'append'
          "content": "aa\nbb",
          "color": "#fff",
      },
      "labelFormat": function(d) {
          return d + '%';
      },
      "elastic": true,
      /* 新增,若为弹性则可配置以下样式 not required */
      "ringRange": [80, 90],
      /* 环的内外径(为0~width/2间数)  not required */
      "selectedRange": [75, 95] /* 选中环的内外径(为0~width/2间数)not required */
      /* 新增,环内壁阴影加深 not required */
      "innerShadow": 10,
      "stroke": 1,// 每个part之间的间隙
  }

Bar Chart:

  chart.bar(data[, config])
  • data example
  {
      series: [{
          data: [{
                  xValue: '20',
                  yValue: 7.3
              },
              {
                  xValue: '20~24',
                  yValue: 31.7,
                  color: "#FCB205" //not required
              }
          ],
          style: {
            borderRadius: 3, // not required 不设置默认没有圆角
            fill: "linear-gradient", // 可以设置颜色值覆盖color中的配置 但是不能覆盖data中单个柱子的颜色
            opacity: 1, // not required 不传默认为1
            gradient: {
              colors: ["#188df0", "#83bff6"] // 从上到下渐变 传一个颜色值,第二个默认为柱状图原颜色值
            }
          }
      }],
      style: {
        position: 'stack', // 可选,默认stack,另外有dodge并排展示
      },
      xAxis: {
          type: 'category',
          barWidth: "100",
          data: ['20', '20~24', '25~29', '30~34', '35~39', '40'],
          // 坐标样式定制,x/y轴有效, from 1.3.7
          style: {
              rotate: 45,// 注意rotate位置的计算还是经验值,开启的时候,box的bottom值需要按需设定
              color: 'red' | ['red', 'blue'],
              fontSize: 10,
          },
          format: () => {
              // 由于目前结构问题,暂未实现分行
          }
      },
      yAxis: {
          type: 'linear',
          data: [40, 0],
          unit: '%' //not required
          hide: true //设定后网格和y轴将隐藏not required
      }
  }

Scatter Chart:

  chart.scatter(data[, config])
  • data example
  {
      xAxis: {
          type: 'time',
          splitNumber: 4, // x轴均可设置间隔
          data: [20170524,
              20170525,
              ...
          ]
      },
      yAxis: {
          type: 'points',
          data: [123, 345, ...] /* not required */
      },
      series: [{
          "color": {
              "normalDots": "rgba(25, 100, 150, 0.5)",
              /* 普通点颜色 not required */
              "markedDots": "rgba(120, 36, 50, 0.5)" /* 特殊点颜色 not required */
          },
          "data": [{
                  yValue: 3160,
                  tooltip: '2017-06-22 3160',
                  xValue: 20170524
              },
              {
                  yValue: 7556,
                  tooltip: '2017-06-23 7556',
                  xValue: 20170525
              }
          ]
      }, ]
  }

Line Chart:

  chart.line(data[, config])
  • data example
  {
      xAxis: {
          type: 'time',
          cutIndex: 2,
          /* 可选,设定后x轴index为2的点后的线条为虚线  */
          data: [20170524,
              20170525,
              ...
          ]
      },
      yAxis: {
          type: 'points',
          /* 可选,设true后y轴最小值为数据最小值而不是0  */
          persistence: false,
          /* 可选,指定后y轴不按data值来计算  */
          domain: [10000, 10000],
          data: [123, 345, ...], /* not required */
          animation : { duration: 300 }, /* not required, 坐标更新时的动画过渡时间,默认300ms,传0则无动画 */
          /* 标记线 not required */
          markLine: {
              value: 125,
              color: 'red',
              name: 'xxxx',
          },
          /* 标注每个series的最大值 not required */
          max: {
              type: 0, // 0:唯一最大值, 1:各分支最大值
              color: "#f00", // 仅type为0有效
              seriesIndex: 1 // type为0时,指定标注某个serie的最大值
          },
          /* 自定义y轴 not required */
          format: function(d) {
              return d * 0.001 + 'K'; // d为y轴当前数值
          }
      },
      series: [{
              name: '收益',
              /*not required, if you need legend you should give it to me */
              color: '#010101',
              /* not required */
              dashed: true,
              /* not required */
              data: [{
                      yValue: 3160,
                      tooltip: '2017-06-22 3160', // 单行字符串
                      xValue: 20170524
                  },
                  {
                      yValue: 7556,
                      tooltip: '2017-06-23;名称;7556;7556', // 分别对应下文tooltip对象中的['title', 'name', 'desc', 'value']
                      xValue: 20170525
                  }
              ]
          },
          {
              data: [{
                      yValue: 60000,
                      tooltip: { //tooltip的推荐格式
                        "title": "2017-08-29 new",
                        "name": "爱奇艺",
                        "value": "864",
                        "desc": "864 new"
                      },
                      xValue: 20170524
                  },
                  {
                      yValue: 80000,
                      tooltip: '2017-06-23 8',
                      xValue: 20170525
                  }
              ]
          }
      ]
  }

Area Chart:

  chart.area(data[, config])
  • data example
  {
      xAxis: {
          type: 'time',
          data: [20170524,
              20170525,
              ...
          ]
      },
      yAxis: {
          type: 'points',
          data: [123, 345, ...] /* not required */
      },
      style: {
        position: 'stack',//  TODO: 堆叠布局,默认dodge,面积图有重叠效果,为stack时堆叠(适合表示整体和个体的关系)
      },
      series: [{
              // 线条颜色
              "color": "#DF514E", // style无配置,则面积区域透明度为0.2
              // 展示为虚线,1.4.5开始不再有默认虚线,需要手动指定
              "dashed": true,
              // 面积图渐变
              "style": {
                  "fill": "linear-gradient", // 如果是色值,则覆盖color中的配置
                  "opacity": 0.2, // 默认0.2
                  "gradient": {
                    // start stop(兼容老api 不传stop默认为rgb(255,255,255)) 与 colors同时存在时 colors优先级更高
                      "start": "#f3a33a",
                      "stop": "#fcedd8",
                      "colors": ["#f00"] // 从上到下渐变 传一个颜色值,第二个默认为rgb(255,255,255) 传 >= 2的颜色值均分渐变
                  },
                  "smooth": false, //如果是 boolean 类型,则表示是否开启平滑处理。如果是 number 类型(取值范围 0 到 1),表示平滑程度使用指定的 alpha 值返回一条 Catmull–Rom 生成器。如果 alpha 为 0 则等价于 curveCardinal(略陡峭),如果 alpha 为 1 则会生成 chordal 曲线(略平缓),如果 alpha 为 0.5 则会生成 centripetal spline(更为贴近折线)。设为 true 时相当于设为 0.5。
              },
              data: [{
                      // 标注点的颜色和信息
                      "label": "这里的内容会和tooltip拼接起来用'\n'连接",
                      "labelStyle": {
                          "color": "#10df67"
                      },
                      "xValue": "2017-08-20T00:00:00.000Z",
                      "yValue": 1474,
                      "tooltip": "2017-08-20 周日 1474场次",
                      "text": "测试"
                  },
                  {
                      "label": "",
                      "xValue": "2017-08-29T00:00:00.000Z",
                      "yValue": 871,
                      "tooltip": "2017-08-29 周二 871场次",
                      //标注文字和样式
                      "text": "上映",
                      "textStyle": {
                          "color": "#2598B6",
                          "size": "12px",
                          "padding": "8px"
                      }
                  }
              ]
          },
          {
              data: [{
                      yValue: 60000,
                      tooltip: '2017-06-22 6',
                      xValue: 20170524
                  },
                  {
                      yValue: 80000,
                      tooltip: '2017-06-23 8',
                      xValue: 20170525
                  }
              ]
          }, {
              // 在面积图上加上线条
              "type": "line",
              "dashed": true,
              "color": "#2598B6",
              "showSelected": false, // true显示上面的点
              "data": [{
                  "xValue": "2017-08-30T00:00:00.000Z",
                  "yValue": 7.2
              }, {
                  "xValue": "2017-08-31T00:00:00.000Z",
                  "yValue": 4.6,
                  "tooltip": { //tooltip的推荐格式
                        "title": "2017-08-29 new",
                        "name": "爱奇艺",
                        "value": "864",
                        "desc": "864 new"
                    },
              }, {
                  "xValue": "2017-09-01T00:00:00.000Z",
                  "yValue": 1
              }]
          }

      ]
  }

Map:

  chart.map(data[, config])

data 是绘图的关键,现兼容 d3 和 AntV 两种 GeoJSON。中国地图的简单版(适用于移动端,数据格式为 d3 标准)和复杂版(适用于 PC 端,数据格式为 AntV 标准)数据都在项目的src/browser/map目录下,可以直接导入使用。

  • data example
  {
    "type": "FeatureCollection",
    "features": [{
            "type": "Feature",
            "properties": {
                "id": "65",
                "size": "550",
                "name": "新疆",
                "cp": [84.9023, 42.148],
                "childNum": 18
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [96.416, 42.7588],
                        [96.416, 42.7148],
                        ...
                    ]
                ]
            }
       }]
  }

注意事项:

  • axis 有四种类型: 'category', 'time', 'linear' and 'points', 和 d3 定义一致
  • 如果要使用'time'类型, 所对应的 x 轴信息必须是 Date 类型
  • y 轴暂时只有'linear', 'points'两种类型

TODO:

  • 文档完善,EN version
  • 双坐标混搭(例:折线+bar)
  • stack Area
  • 隐藏坐标
  • hydrate 体积优化*
  • 图表连续性(断点不显示,现可由入参过滤实现)*
  • 横纵转换*
  • 图标类型切换*