来自RCC(8)规范或类似的维恩图生成软件

请注意:虽然赏金不再可用,但我仍然热衷于回答这个问题的任何人做出贡献; 我还在看着它,我在等着看是否有更好的答案。 谢谢,请继续阅读……


我正在寻找一种方法来将描述约束网络的任意RCC类空间关系(或类似)转换为类似维恩图的图像。 例如,RCC8中表示的约束网络:

W {EC} YX {TPP} YZ {NTPP} YZ {PO} X

..可以用下图用圆形或方形区域表示:

示例1:使用圆形区域表示约束网络的维恩图。 ..alternatively: 使用正方形区域表示约束网络的维恩图。

是否有人知道软件至少可以通过编程方式(通过API)从类似RCC的约束规范生成这样的图表?

我知道这样的约束网络可能是不明确的,排除了与任何单个这样的图表的匹配(可能存在许多解决方案)。 理想情况下,我想通过能够生成可能的替代方案来解决这个问题,但现在可以求助于(并提出错误)。

需要明确的是,在这个问题中,我特别要求软件能够以声明的方式基于类似RCC的约束来计算图表布局 。 我不关心将RCC的DSL转换成其他语法的工具,也不关心特定的图像序列化格式或方法。 我希望找到一个算法来处理最多六个唯一集的任意数量的约束。

注意: Graphviz (如下面提到的@vickirk)是一个图表布局软件包的例子,它类似于我所追求的。 不幸的是,似乎Graphviz本身无法解决这个问题(但我很高兴被certificate是错误的!)。 这似乎是一个非常难的问题。

谁需要后端? 这是一个使用HTML / CSS / JS的工作原型

http://jsfiddle.net/RuvE6/6/

只需在字段中输入RCC8代码语法,然后单击按钮!

HTML / CSS / JS RCC8 Diagram Builder

目前的一些限制:

  • 不处理歧义
  • 如果语法关闭,则没有error handling
  • 在一些有效的案例中可能会中断(我没有测试过很多)
  • 没有实现任何相反的情况(还没?)

编辑:它是如何工作的

基本上,这些图表显示了两个关系

  • A 包含 B.
  • A B 相邻

然后有子类型或变体,如:

  • A 包含 BB A 相切
  • A B 相邻A B 重叠

这两个基本概念都融入了HTML渲染世界:

  • 包含 – >嵌套的HTML元素:

  • adjacency – >兄弟HTML元素:

我使用特殊类来处理这些变化(相当粗略地)摆动边缘以完成所需的布局:

  • 包含,切线:

    (孩子的上边距为负,触摸父母)

  • 邻接,重叠:

    (添加了一个包装器在孩子身上触发CSS – 第二个元素的左边距为负,与第一个元素重叠。)

在jsfiddle中注释了一些静态标记,显示了我开始使用的结构。

为了完成function循环,有一些代码将RCC8语句解析为A {XX} B部分,并尝试为每个部分呈现必要的标记。 它会检查不重复的区域。 之后我也会经历并将所有兄弟姐妹的高度设置为相同,这样可以确保它们重叠和/或正确连接。

这段代码真的只是一个开始,它有它的自负。 它基本上是一个线性图,这意味着它不会处理存在复杂邻接的情况,例如:

A {EC} B, C {EC} B, D {EC} B

这些可以通过智能JS解析和更复杂的CSS来处理,但可能很快进入更多力导向布局的领域(例如, 更智能的 气泡图 )。

我不知道任何可以生成这种图表的软件。 但是,如果我必须解决您的问题,我可能会探索使用可缩放矢量图形(SVG)的可能性。 我认为您可以将您的RCC DSL转换为SVG XML,然后您可以渲染它(可能在Web浏览器中)。 您可以通过搜索“svg venn diagram”轻松地在Web上找到示例。 一个很好的一个在这里 :这是我从该网站生成的图表

在此处输入图像描述

这是相应的SVG代码(也来自网站):

    WIBR Venn diagram    

还有一个名为Batik的用于SVG的Apache工具包,它应该支持SVG的显示,生成或操作。

另一个选择是使用TikZ和PGF与LaTeX:你有强大的宏,让你以编程方式放置形状,渲染由LaTeX完成。 这是一个例子:

 \documentclass[a4paper,10pt]{article} \usepackage{tikz} \usetikzlibrary{shapes,calc} \begin{document} \pagestyle{empty} \begin{tikzpicture} \node (TPP) {X TPP Y}; \node [ circle, draw, minimum width=2cm, label={[label distance=-0.7cm]145:X}, ] (X) [right of=TPP,xshift=1cm] {}; \node [ circle, draw, minimum width=1cm, anchor=south east, ] (Y) at (X.south east) {Y}; \end{tikzpicture} \end{document} 

产生以下(即RCC8 TPP关系):

在此处输入图像描述

您可以从LaTeX代码中看到,您可以在X( X.south west )的西南方向绘制Y圆圈,表示Y的锚点也位于西南方( anchor=south west )。 您可以在此处找到更复杂的示例,并在此处进行一些额外的讨论。

虽然这还不是一个为您绘制RCC8关系的布局算法,但我认为您可以定义将RCC8关系转换为PGF / TikZ宏的LaTeX宏。 缺点是您必须编译LaTeX代码。

我希望这个帮助能祝你好运!

你有没有评估过antlr,你可以为RCC8定义一个EBNF语法。 使用antlr生成项目列表。 此项目列表可用作VennMaster等软件的输入,用于绘制图表。

其他选择是Goolge Charts,

http://bioinfogp.cnb.csic.es/tools/venny/index.html