小技巧:用 Veusz 画堆积面积图

Veusz 是一款轻量级绘图软件,之前已经介绍过了:

最近需要用它画堆积面积图,搜了一圈发现好像资料不多,这里我就自己写一个小教程,供有需要的朋友们参考。

引言

先给大家看一下画好的图:

图表.svg

总的来说,就是我们采了一个岩芯样本,并分析了不同深度样品中各种粒径的颗粒物组成。岩芯中的颗粒物可分为三种:黏土、粉砂、砂。岩芯不同深度,这三种组分的含量是不同的。

为了表示这三种组分所占比例随深度的变化,我们绘制了一幅堆积面积图。

操作方法

(0)准备数据

Veusz 不支持读取 Excel 表格,因此建议大家先将数据保存为 UTF-8 编码的 CSV 文件。

(1)导入数据

点击 “Import Data into Veusz” 按钮,然后在弹出窗口中点击 Browsw... 按钮,打开数据文件。

001.png

File preview 窗口中确认数据文件,确定没问题后,点击 Import 导入数据。

002.png

导入数据后会弹出如下窗口,表示数据已经成功导入到软件中。然后点击 Close 即可。

(2)建立图表

Veusz 中默认的画布是横版的,但这里我们需要使用纵版,纵版画布的模板我发在 2 楼了。

大家也可以设计自己喜欢的版式,具体操作可参考本教程,我这里就不展开讲了:

https://www.bilibili.com/video/BV15T4y1u7tu/

回到软件主窗格,点击左侧窗格中的 x 和 y,分别设置 x、y 轴的标题

004.png

接下来,选择左侧图层列表中的 graph1,然后点击 Plot bar charts 按钮,插入柱状图。(在 Veusz 中,堆积面积图算作柱状图的一种)

003.png

因为我们要绘制三种组分的分布,我们需要建立三个单元。点击刚刚插入的柱状图 bar1,点击 Lengths 文本框右侧的 + 按钮,新建两个 Length 项目。

005.png

在 Veusz 中,

  • 如果你希望用柱状图的长度表示某一变量的大小,请将其设置为 “Lengths”
  • 如果你希望用某一变量决定图中柱的位置,请将其设置为 “Positions”

因为我们要表示含量随深度的分布,因此我们将黏土、粉砂、砂的含量设为 “Lengths”,而将 “深度” 设为 “Positions”。

006.png

此外,我们还需要做如下调整:

  • 由于这幅图中,表示位置的变量放在 Y 轴,我们需要将 Direction 设置为 horizontal
  • 为了让图像以堆积面积图、而不是一个个分离的条带的形式呈现,我们需要将 Mode 设置为 stacked-area

(3)添加图例

点击 Key text 旁边的 +,再添加两个项目(因为我们一共有三种组分),并依次输入各项目的名称:

007.png

:warning: 注意:Key length 中各项目名称的顺序务必与 Lengths 保持一致。

然后,点击Plot key 按钮,添加图例。

008.png

在左侧窗格中将刚刚添加的图例元素 key1 拖到最上面,以免其被其他项目遮挡。

009.png

(4)美化图表

有句话说得好,“图表是数据的美学映射”。Veusz 默认的配色未必符合您的审美,不过没关系,我们可以简单调整一下。

首先是修改堆积面积图的配色。

  1. 点击选中 bar1 项目,
  2. 然后在 Formatting - Veusz 窗格中,点击选项卡的第二项,
  3. 点击 Fill style 窗格下的 Add 按钮,再添加两个项目。
  4. 点击新添加项目右侧的方块按钮,为每个项目设置颜色。

010.png

然后是调整图例大小。图例中的色块,默认长度设置是 1 cm,有点大,看起来喧宾夺主。我们可将其适当缩小一些。

  1. 点击选中 key1 项目,
  2. 然后在 Formatting - Veusz 窗格中,点击选项卡的第一项,
  3. 设置 key length,个人认为 0.4 cm 比较合适。

011.png


以上就是全部操作过程了,接下来保存工程文件,再导出图表为你需要的格式即可。

本文写作比较仓促,其中难免有纰漏之处,欢迎大家批评指正。如有其他问题,也欢迎大家留言讨论。

4 个赞

补充一下:这里用的纵版图表模板是我自己制作的,模板如下:

模板
# Veusz saved document (version 3.6.2)
# Saved at 2024-12-18T13:27:52.425072

SetCompatLevel(1)
Set('width', '10cm')
Set('height', '10cm')
Set('colorTheme', 'default-latest')
Set('StyleSheet/Font/font', '霞鹜新晰黑')
Set('StyleSheet/Font/size', '10pt')
Set('StyleSheet/axis/TickLabels/size', '8pt')
Set('StyleSheet/axis-function/autoRange', 'next-tick')
Set('StyleSheet/xy/markerSize', '2pt')
Set('StyleSheet/xy/errorStyle', 'barends')
Set('StyleSheet/xy/PlotLine/width', '1pt')
Set('StyleSheet/xy/MarkerLine/hide', True)
Set('StyleSheet/xy/ErrorBarLine/width', '1pt')
Set('StyleSheet/xy/ErrorBarLine/endsize', 2.0)
Add('page', name='page1', autoadd=False)
To('page1')
Set('width', '6cm')
Set('height', '8cm')
Add('graph', name='graph1', autoadd=False)
To('graph1')
Set('leftMargin', '1cm')
Set('topMargin', '1cm')
Set('bottomMargin', '0.2cm')
Add('axis', name='x', autoadd=False)
To('x')
Set('autoMirror', False)
Set('lowerPosition', 0.0)
Set('upperPosition', 1.0)
Set('otherPosition', 1.0)
Set('MinorTicks/hide', True)
To('..')
Add('axis', name='y', autoadd=False)
To('y')
Set('autoMirror', False)
Set('direction', 'vertical')
Set('lowerPosition', 1.0)
Set('upperPosition', 0.0)
Set('MinorTicks/hide', True)
To('..')
To('..')
To('..')

这里有一项

Set('StyleSheet/Font/font', '霞鹜新晰黑')

是设置全局的默认字体设置,大家可根据需要换成其他你喜欢的字体。

要使用该模板,复制上述代码,保存成 图表.vsz,再用 Veusz 打开,即可得到一个空白的纵版图表。

这也太科研,哦不,硬核了吧

1 个赞

其实画面积堆积图在 Excel 里面算是基本操作……只不过有的(准确点说,很多)研究人员不喜欢 Excel 画的图表。

确实硬核,科研人果然学无止境。

这都开始写一行行的代码了,要不考虑一下学学 R 语言,不光出图好看,代码还能复用,还能对数据进行一系列处理和各种统计学分析哦,而且也不怕你换操作系统,哪个系统都能用 :wink:
基本上 R 语言+几个包(ggplot2,ggpubr,ggsci)差不多就够作图了,现在又有各种 chatbot,学个编程、让机器按需求改个代码也很快哦

不是说不喜欢或者不准确或者不好看,而是一旦放excel图表就会被指责不professional。许多行业都这样

这里需要解释一下:那个模板其实也是我用 Veusz 做的,是通过它的 GUI 界面设计的,设计好后保存成了工程文件。但因为没找到合适的网盘来分享文件,就直接把文件的源代码贴出来了。

R 语言用过,确实好用,支持的图表种类也很多,感觉完全不输 OriginLab、SigmaPlot 这种商业软件。

但我个人还是更喜欢用 GUI 画图,毕竟每一步的操作都能立即反映到画布上,更加直观,也方便我做一些细节的调整。用代码绘图虽然适合批量操作,但有时候为了扣一个细节要反复改好几次代码,每次改完又需要重新执行一次,有一点麻烦。

1 个赞

没办法,所谓的 “鄙视链”。

不过其实 Excel 画的图表,只要用心改一改,根本看不出来是什么画的。我之前认识一位大佬,他的图表都是用 Excel 画,画好再改一改,效果和 SigmaPlot 那种专业软件的效果没有区别,甚至更 “专业”。

你这代码量已经超过R语言了。。。

啊,这……我说了这不是手写的代码,只是软件输出的工程文件啊……

Veusz 画图根本不需要用代码的,对没有编程基础的人非常友好。

话说各位为什么只看2楼那一堆代码,不读一读1楼的操作流程啊……

因为就这个场景来说, 代码的信息密度要比图文流程的要密集得多。。
另外就是如果不是正好要用,我一般不关心具体流程

好的,谢谢提醒。看来确实是现在这样写,二楼有点喧宾夺主了。

不过,恕我冒昧,还是希望您认真看一下我写的是什么再评论 :folded_hands:


为了避免误会,我还是再解释一下吧:一楼的绘图过程需要用一个纵版图表的模板,那个模板是我自己用 Veusz 做的。我本来想把文件直接发上来的,但手头没有合适的网盘。而我用文本编辑器打开那个模板文件后,发现它是一个纯文本文件,于是就偷了个懒,直接把文件内容贴上来了 :doge: