有没有人有任何减少graphviz生成的图形大小的一般提示(区域大小,而不是文件大小).
我有一个相当大的图(700个节点).我为每个节点设置了较小的字体大小,但它似乎只减小了字体大小而不是实际的节点大小.是否有任何属性可以减少图表中的总空白量?谢谢!
我正在尝试使用点显示从右到左(即向后)的边缘:
C <- A -> B
Run Code Online (Sandbox Code Playgroud)
我能做的最好的事情是:
digraph {
a -> b;
c -> a [dir="back"];
{rank=same;c a b}
}
Run Code Online (Sandbox Code Playgroud)
..这很好,除了我不喜欢使用c -> a
边缘指向另一个方向.
所以我想分享这个解决方案(似乎没有在SO上提及),并检查我是否遗漏了一些明显的东西.
绘制一个集团图
import networkx as nx
....
nx.draw(G, layout=nx.spring_layout(G))
Run Code Online (Sandbox Code Playgroud)
产生如下图:
显然,需要增加节点之间的间隔(例如,边缘长度).我用谷歌搜索了这个,并在这里找到了这个建议:
对于某些布局算法,存在可能有帮助的"缩放"参数.例如
在1中:将networkx导入为nx
在2:G = nx.path_graph(4)
在[3]中:pos = nx.spring_layout(G)#default to scale = 1
在[4]中:nx.draw(G,pos)
在[5]中:pos = nx.spring_layout(G,scale = 2)#所有节点之间的双倍距离
在[6]中:nx.draw(G,pos)
但是,该scale
参数似乎没有任何影响.
获得更好绘图的正确方法是什么?
嘿,我想在我的网站上绘制基于PHP的图形(Stdent标记分布).我怎样才能做到这一点?
在制作图形时,我有完美的瘫痪.如果没有充分探索视觉的对称性,我很难理解正在发生的事情.我也是一个非常直观的学习者,我喜欢简化我刚刚学到的东西并将它们写在纸上.
Graphviz是一个自动绘制东西的好工具,但它可能更好.让我们从一个好图(一个状态机)的例子开始.没关系质量(它可以用更好的工具重新绘制)这个几乎是完美的,除了我将逆时针旋转45度以使对称性明显.然后,它应该让读者花更少的时间来弄清楚状态q1和q2是如何相似以及它们在何处不同.我认为,只有一种最好的方式来表示该图表,因为它旁边没有其他图形.
现在让我们来看一个不太完美的描述:
这看起来像是graphviz会生成的东西.是的,边缘是光滑的,但GAAAAWWWD这是不必要的混乱!它看起来像一张思维导图,而不是一张准备好消费的完成图.我相信人眼CRAVE(不能少)对称.是的,等级制度等也是重要因素.
我很惊讶没有更好的算法可用.有些人根本不是视觉学习者; 他们可以通过阅读符号来掌握抽象概念.不是我!
那么,我的问题是什么?那么,是否有更好的免费软件可用于绘制中小型图形?也许
谢谢!
让我知道如何改进这篇文章.
PS我花了10分钟在dia中画出一个类似的克隆.它仍然不是很完美,但它很方便制作,因为一切都按网格(我错过了一些小细节,但不想重新上传).LR_0需要来自上方的"开始--->"以让用户更快地掌握起始状态.
以树形式在DAG中布置顶点(即顶部没有内边的顶点,顶点仅依赖于下一层上的顶点等)是相当简单的,没有图形绘制算法,如Efficient Sugiyama.但是,是否有一个简单的算法可以最大限度地减少边缘交叉?(对于某些图形,可能无法完全消除边缘交叉.)图片说千言万语,所以有一种算法可以提示没有交叉边缘的东西.(与此相比).
我已经接受了Senthil的建议graphviz/dot - 快速浏览文档确认它很容易用作库或外部工具,并且输出格式非常容易解析.但是,我最终选择使用GraphSharp,因为我已经在使用.NET等(虽然它绝对没有dot那么强大).结果是"足够好",并且通过一点边缘路由和调整可以做得更好(模糊文本是因为3.5 WPF).
这是完整的 C#代码(这是引用QuickGraph或GraphSharp的所有代码 - 是的;就这么简单):
internal static class LayoutManager
{
private const string ALGORITHM_NAME = "EfficientSugiyama";
private const bool MINIMIZE_EDGE_LENGTH = true;
private const double VERTEX_DISTANCE = 25;
private const double LAYER_DISTANCE = 25;
private const double MIN_CANVAS_OFFSET = 20;
public static void doLayout(GraphCanvas canvas)
{
// TODO use a background thread
// TODO add comments
canvas.IsEnabled = false;
canvas.Cursor …
Run Code Online (Sandbox Code Playgroud) 我想以编程方式创建这样的图表 http://yaroslavvb.com/upload/junction-tree-decomposition.png
我想我应该使用带有VertexCoordinateRules,VertexRenderingFunction和EdgeRenderingFunction的GraphPlot作为图形.我应该使用什么彩色斜面背景?
编辑 主要使用Simon的想法,这是我最终使用的简化的"不太健壮"的版本
Needs["GraphUtilities`"]; GraphPlotHighlight[edges_, verts_, color_] := Module[{}, vpos = Position[VertexList[edges], Alternatives @@ verts]; coords = Extract[GraphCoordinates[edges], vpos]; (* add .002 because end-cap disappears when segments are almost colinear *) AppendTo[coords, First[coords] + .002]; Show[Graphics[{color, CapForm["Round"], JoinForm["Round"], Thickness[.2], Line[coords], Polygon[coords]}], GraphPlot[edges], ImageSize -> 150] ] SetOptions[GraphPlot, VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .15], Black, Text[#2, #1]} &), EdgeRenderingFunction -> ({Black, Line[#]} &)]; edges = GraphData[{"Grid", {3, 3}}, "EdgeRules"]; colors = {LightBlue, LightGreen, LightRed, LightMagenta}; vsets = {{8, 5, …
我想在我的程序中嵌入一个绘制画布的流程图.用户可以:
绘图后,程序只需要获取连接逻辑(在数据结构中像Directed图)和属性进行进一步计算.
是否有任何免费或开源的C++库来执行此操作?(不需要跨平台,在Windows中可用就足够了.)
我正在尝试理解Bitmap或Image的这两种方法.一个存在.SetPropertyItem()
,另一个存在.GetPropertyItem()
.
我完全混淆了文档说我要设置属性项的方式.
从Microsoft文档中,它声明我们应该通过图像中已存在的属性项的id选择属性项,为该属性项提供新ID,设置属性,然后使用该检索到的属性设置image属性项项目.
这太奇怪了,但真正让我感到的是我们不能只将属性项的id设置为我们必须将属性项id设置为属性项id列表中已存在的id的任何ID.
令人困惑的是,我正在使用已经通过其他方式设置的属性并覆盖它的属性,然后使用属性id列表中的其他现有ID将其添加回图像.
我在这里错过了什么?有没有办法简单地创建一个新的PropertyItem,然后将具有任何给定ID的属性项添加到图像或位图?
这是我正在谈论的一个例子.20752的ID是图像已有的属性,当我设置PropertyItem的ID时,20753是Image所具有的ID.
这将成功设置属性项.
private void Form1_Load(object sender, EventArgs e)
{
string path = Environment.CurrentDirectory + @"\sample.png";
Image image = Image.FromFile(path);
PropertyItem pi = image.GetPropertyItem(20752);
pi.Id = 20753;
pi.Type = 1;
pi.Value = Encoding.UTF8.GetBytes("MyImageInfo");
pi.Len = pi.Value.Length;
image.SetPropertyItem(pi);
image.Save(Environment.CurrentDirectory + @"\sample2.png");
}
Run Code Online (Sandbox Code Playgroud)
这将成功检索PropertyItem.
private void Form1_Load(object sender, EventArgs e)
{
string path = Environment.CurrentDirectory + @"\sample.png";
Image image = Image.FromFile(path);
PropertyItem propItem = image.GetPropertyItem(20753);
}
Run Code Online (Sandbox Code Playgroud)
有一种方法,我可以用自己的ID创建一个新的PropertyItem,而不必做所有那些奇怪的东西?或者我在这里遗漏了什么?
或者,是为图像或位图设置其他类型属性的更好方法吗?我正在寻找一种基本的方法来保存信息并在以后检索它.
我在这做错了什么?
我画了以下网格:
使用以下两种方法绘制上述网格,一种用于计算网格,另一种用于计算每个单元格的中心:
//makes grid in picture box
private void drawGrid(int numOfCells, int cellSize, Graphics gr)
{
Pen p = new Pen(Color.SteelBlue);
for (int i = 0; i < Math.Sqrt(numOfCells) + 1; i++)
{
// Vertical
gr.DrawLine(p, i * cellSize + 300, 200, i * cellSize + 300, 700);
// Horizontal
gr.DrawLine(p, 300, i * cellSize+200, 800, i * cellSize+200);
}
this.topology.SendToBack();
}
//draw the center point for each cell of the grid
private void drawCenters(Graphics gr)
{
for (int j …
Run Code Online (Sandbox Code Playgroud)