使用Altair / Vega-Lite / Vega-Embed控制画布大小

4

我正在使用Vega-Lite构建图形,并使用Vega-Embed在DOM内呈现它们。我很喜欢这些工具和抽象,但我仍在弄清楚它们中的一些工作原理。

我正在开发一个应用程序,其中控制画布的确切大小非常重要。不幸的是,当我指定(例如)

bars = alt.Chart(df).mark_bar().encode(
  x='bins:O',
  y="weights:Q"
).properties(width=240, height=200)

我收到的图表对象如下:
{
  "$schema": "https://vega.github.io/schema/vega-lite/v2.6.0.json",
  "config": {
    "view": {
      "height": 300,
      "width": 400
    }
  },
  "data": {
    "name": "data-a681d02fb484e64eadd9721b37015d5b"
  },
  "datasets": {
    "data-a681d02fb484e64eadd9721b37015d5b": [
      {
        "bins": 3.7,
        "weights": 5.555555555555555
      },
      {
        "bins": 10.8,
        "weights": 3.439153439153439
      },
      {
        "bins": 17.9,
        "weights": 17.857142857142858
      },
      {
        "bins": 25.0,
        "weights": 24.206349206349206
      },
      {
        "bins": 32.0,
        "weights": 16.137566137566136
      },
      {
        "bins": 39.1,
        "weights": 12.3015873015873
      },
      {
        "bins": 46.2,
        "weights": 9.788359788359788
      },
      {
        "bins": 53.3,
        "weights": 5.423280423280423
      },
      {
        "bins": 60.4,
        "weights": 3.439153439153439
      },
      {
        "bins": 67.5,
        "weights": 1.8518518518518516
      }
    ]
  },
  "encoding": {
    "x": {
      "field": "bins",
      "type": "ordinal"
    },
    "y": {
      "field": "weights",
      "type": "quantitative"
    }
  },
  "height": 200,
  "mark": "bar",
  "width": 240
}

(注意config.view中的不同高度和宽度。)
我这样渲染HTML:
<div id="my_id"></div>
<script>
const vlSpec = my_chart_obj;
vegaEmbed('#my_id', vlSpec, {
    actions: false
}).then(result=>console.log(result)).catch(console.warn);
</script>

这将产生:
<div id="my-id" class="vega-embed">
  <canvas width="284" height="252" class="marks"></canvas>
  <div class="vega-bindings"></div>
</div>

注意:width="284" height="252" 看起来宽度和高度被填充了,但我无法弄清楚为什么或如何进行填充。
图形本身看起来很棒,除了它的大小不正确,结果搞乱了我的布局。 enter image description here 帮帮忙!
2个回答

4
config.view 中的宽度和高度是由Altair的默认主题设置的,在上面创建的图表上没有影响,因为它们被图表级别的 widthheight 属性覆盖。
如果您希望从图表中删除此配置,则可以运行
alt.themes.enable('none')

清除默认图表主题可以使用alt.themes.enable('default')来恢复默认主题。


关于画布大小:图表的widthheight属性默认控制图表面板本身的大小,不包括轴标签和标题的额外填充。如果你希望整个画布都适合指定的边界,包括标签填充,则可以通过自动缩放属性来指定;例如:

alt.Chart(df).mark_bar().encode(
  x='bins:O',
  y="weights:Q"
).properties(
    width=240,
    height=200,
    autosize=alt.AutoSizeParams(
        type='fit',
        contains='padding'
    )
)

输入图像描述

但要注意,这种方法并不适用于每种图表类型;更多信息请参阅自适应大小的限制


谢谢!这非常有帮助。 - Abe

0

我曾因为我的标签被截断而苦苦挣扎。

确保添加填充值,以使自动调整与标签正确工作。

.properties(
    width=800,
    height=600,
    padding=100,
    autosize=alt.AutoSizeParams(
        type='pad',
        contains='padding'
    )
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接