如何从 python 图创建一个 JS 文件

佘汗

我使用 altair 使用 python 创建图形。所以我使用了以下代码来保存图表。

chart.save('chart.html', embed_options={'actions': False})

我的 chart.html 文件如下所示,

<!DOCTYPE html>
<html>
<head>
  <style>
    .error {
        color: red;
    }
  </style>
  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm//vega@5"></script>
  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm//[email protected]"></script>
  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm//vega-embed@6"></script>
</head>
<body>
  <div id="vis"></div>
  <script>
    (function(vegaEmbed) {
      var spec = {"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "data": {"url": "https://cdn.jsdelivr.net/npm/[email protected]/data/cars.json"}, "mark": "point", "encoding": {"color": {"type": "nominal", "field": "Origin"}, "x": {"type": "quantitative", "field": "Horsepower"}, "y": {"type": "quantitative", "field": "Miles_per_Gallon"}}, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json"};
      var embedOpt = {"actions": false, "mode": "vega-lite"};
function showError(el, error){
          el.innerHTML = ('<div class="error" style="color:red;">'
                          + '<p>JavaScript Error: ' + error.message + '</p>'
                          + "<p>This usually means there's a typo in your chart specification. "
                          + "See the javascript console for the full traceback.</p>"
                          + '</div>');
          throw error;
      }
      const el = document.getElementById('vis');
      vegaEmbed("#vis", spec, embedOpt)
        .catch(error => showError(el, error));
    })(vegaEmbed);
</script>
</body>
</html>

这很好用,我可以毫无问题地看到我的图表。但我需要将其转换为 javascript 文件,以便我可以在需要时调用该脚本。有没有办法获得如下的javascript文件?

mychart.js
----------
(function(vegaEmbed) {
      var spec = {"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "data": {"url": "https://cdn.jsdelivr.net/npm/[email protected]/data/cars.json"}, "mark": "point", "encoding": {"color": {"type": "nominal", "field": "Origin"}, "x": {"type": "quantitative", "field": "Horsepower"}, "y": {"type": "quantitative", "field": "Miles_per_Gallon"}}, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json"};
      var embedOpt = {"actions": false, "mode": "vega-lite"};
function showError(el, error){
          el.innerHTML = ('<div class="error" style="color:red;">'
                          + '<p>JavaScript Error: ' + error.message + '</p>'
                          + "<p>This usually means there's a typo in your chart specification. "
                          + "See the javascript console for the full traceback.</p>"
                          + '</div>');
          throw error;
      }
      const el = document.getElementById('vis');
      vegaEmbed("#vis", spec, embedOpt)
        .catch(error => showError(el, error));
    })(vegaEmbed);

我的意图是如下使用,然后我可以轻松地从不同的文件中调用它。

<div id="vis"></div>
  <script src="mychart.js"></script>

更新:-

无论如何在创建 JS 之前更改关键字“vis”?如下所示,

const el = document.getElementById('ID1');
          vegaEmbed("#ID1", spec, embedOpt)
            .catch(error => showError(el, error));
乔洛斯特布鲁姆

没有内置函数,所以最简单的可能是根据单词的出现vegaEmbed和偏移量来索引 html 字符串:

import altair as alt
from vega_datasets import data


source = data.cars.url
chart = alt.Chart(source).mark_circle().encode(
    x=alt.X('Horsepower:Q', scale=alt.Scale(nice=False)),
    y='Miles_per_Gallon:Q',
)

html_chart = chart.to_html()
# These offsets will be the same for any chart
start = html_chart.index('vegaEmbed') - 10
end = html_chart.index('vegaEmbed);') + 11
print(html_chart[start:end])
# Out
(function(vegaEmbed) {
      var spec = {"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "data": {"url": "https://cdn.jsdelivr.net/npm/[email protected]/data/cars.json"}, "mark": "circle", "encoding": {"x": {"field": "Horsepower", "scale": {"nice": false}, "type": "quantitative"}, "y": {"field": "Miles_per_Gallon", "type": "quantitative"}}, "$schema": "https://vega.github.io/schema/vega-lite/v5.2.0.json"};
      var embedOpt = {"mode": "vega-lite"};

      function showError(el, error){
          el.innerHTML = ('<div class="error" style="color:red;">'
                          + '<p>JavaScript Error: ' + error.message + '</p>'
                          + "<p>This usually means there's a typo in your chart specification. "
                          + "See the javascript console for the full traceback.</p>"
                          + '</div>');
          throw error;
      }
      const el = document.getElementById('vis');
      vegaEmbed("#vis", spec, embedOpt)
        .catch(error => showError(el, error));
    })(vegaEmbed);

然后,您可以像普通文本文件一样将该字符串变量写入磁盘。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何运行一个js文件?

如何拆分一个js文件?

如何使用Python将多个图保存在一个文件夹中?

Node.js:如何使用现有文件创建一个zip文件

如何向 KML 文件添加一个非常小的地标 - 创建热图

Nativescript:如何从文件路径创建一个 JS File 对象?

如何在Windows命令行中创建一个空的.html和.js文件?

如何在 python 中创建一个新目录并编写一个新的“wb”文件?

如何从 URL 打开一个大文件到内存中并在 Python 中创建一个哈希

如何从另一个.js文件调用.js?

Python tkinter - 如何创建一个在画布上滚动的实时 xy 图

如何创建一个 .csv 文件?

如何创建一个.pyd文件?

如何使用Linux / Python创建一个CSV文件派生列?

如何在Python中使用某人的名字并创建一个使用该名字写入的文件?

python tkinter界面如何创建一个新的以显示txt文件

如何创建一个多级json文件,然后从python中读取特定值?

如何创建一个从远程服务器执行python文件的移动应用程序?

如何从 .txt 文件在 python 中创建一个带有空格的字典

如何在python中创建一个交互式图,根据我单击的位置生成一个新图?

如何从另一个Python文件调用一个Python文件?

如何仅调试一个js文件

如何运行另一个 .js 文件的内容?

如何从另一个 .js 文件访问数组?

我将如何使用 argparse 创建一个 Python3 文件来读取文件的内容?

我如何将数据保存到 .txt 文件而不是创建一个新文件(Python)

我如何在js中的另一个js文件中包含一个js文件

如何创建一个python方法

如何使用dict()从一个文件到另一个python文件