Graphviz:Graphvizにて使用できるattributes(属性?)について仕様を調べる ~arrowhead/arrowtail/arrowsize~
****************** 以下、定期
Graphvizの各コンポーネントにて使用できる属性は以下のページにまとめられている。
しかしながら英語である。いや、英語であることを百歩譲っておいておいたとしても、図形の例がないために具体的にどのような違いが出るのかがわかりにくい。 ということでこのattributesを実際に各コンポーネントに実装して、どんな仕様になるのかということをここに整理していく。
徐々に調査して、追加していく所存。
****************** 以上、定期終了
今回の対象属性はarrowhead/arrowtail/arrowsizeを使用する。
環境
・OS:Windows10にて、VirtualBox6.0.8上のCentOS7.4
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
・Graphviz : 2.38..0
# dot -V dot - graphviz version 2.30.1 (20180420.1509)
arrowhead/arrowtail/arrowsize
対象コンポーネント:エッジ
対象レイアウト:全部
矢印付きのエッジを使用した際に、その矢印の形状および大きさを変更することができる。見ての通りarrowhead
はエッジの頭(A→Bの場合はエッジのB側端)、arrowtail
はエッジの後ろ(A→Bの場合はエッジのA側端)の形状を指定できる。指摘できる形状とそのパラメータは下記のページにまとめられている。
そして、arrowsize
は矢印の大きさを指定することができる。
実際に以下のdotファイルを使用してグラフを作成した。
digraph { layout=dot A -> B [dir=both] C -> D [arrowhead=inv dir=both] E -> F [arrowtail=inv dir=both] G -> H [arrowhead=tee arrowtail=odot dir=both] I -> J [arrowhead=tee arrowsize=2.0 arrowtail=odot dir=both] }
その結果できた図形は以下のとおりである。
グラフのエッジの端が指定した形に変わっているのがわかる。また、サイズを指定した一番右のグラフだけ、エッジの大きさが大きくなっているのもわかる。
ちなみにこのグラフの中で使われている'''dir=both'''という属性は、これはエッジの後ろにも形状を持たせるための属性になります。これをつけていると、一番左の図形のように、エッジの両端が矢印マークを持つようになります。
Graphviz:Graphvizにて使用できるattributes(属性?)について仕様を調べる ~K~
****************** 以下、定期
Graphvizの各コンポーネントにて使用できる属性は以下のページにまとめられている。
しかしながら英語である。いや、英語であることを百歩譲っておいておいたとしても、図形の例がないために具体的にどのような違いが出るのかがわかりにくい。 ということでこのattributesを実際に各コンポーネントに実装して、どんな仕様になるのかということをここに整理していく。
徐々に調査して、追加していく所存。
****************** 以上、定期終了
今回の対象属性は”K”を使用する。
環境
・OS:Windows10にて、VirtualBox6.0.8上のCentOS7.4
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
・Graphviz : 2.38..0
# dot -V dot - graphviz version 2.30.1 (20180420.1509)
K
対象コンポーネント:グラフ、サブグラフ
対象レイアウト:fdp,sfdp
ノード間の距離を大まかに指定できて、値が大きいほど距離が大きくなる。
lenが設定されていた場合には上書きされる。
以下のサンプルコードにて、Kの値をそれぞれ0.3(デフォルト)、1.0、2.0にしたときのグラフを作成する。
digraph { layout=fdp K=[0.3 or 1.0 or 2.0] A -> A0 A0 -> A00 A00 -> A000 A00 -> A001 A00 -> A002 A0 -> A01 A01 -> A010 A01 -> A011 A01 -> A012 A0 -> A02 A02 -> A020 A02 -> A021 A02 -> A022 A -> A1 A1 -> A10 A10 -> A100 A10 -> A101 A10 -> A102 A1 -> A11 A11 -> A110 A11 -> A111 A11 -> A112 A1 -> A12 A12 -> A120 A12 -> A121 A12 -> A122 A -> A2 A2 -> A20 A20 -> A200 A20 -> A201 A20 -> A202 A2 -> A21 A21 -> A210 A21 -> A211 A21 -> A212 A2 -> A22 A22 -> A220 A22 -> A221 A22 -> A222 }
- K=0.3
- K=1.0
- K=2.0
少しずつノードの距離が大きくなっているのがよくわかる。
それにしても、1.0大きくしただけで結構距離が離れるようだった。
Graphviz:Linux上で動かしているGraphvizにて日本語表示の文字化け修正に苦戦した話
結論
Linux上に使用できる日本語フォントが存在しなかったため
詳細
環境
・OS:Windows10にて、VirtualBox6.0.8上のCentOS7.4
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
・Graphviz : 2.38..0
# dot -V dot - graphviz version 2.30.1 (20180420.1509)
経緯等
- Pythonにてgraphvizキックして作成する図形上に日本語を使用しようとしていたら、どうにも日本語表示が文字化けしてしまう。
- Pythonを使っている部分が悪いのかの部分の切り分けをするために、dotファイルを直接作って図形を作成してみたが、それでも文字化けしてしまうため、Pythonじゃないもっと足元の環境が悪そう
- ネットの上の文献たち
*1
*2
*3
*4
を漁って、フォントを指定すればいいらしいということを知る。
→しかしながら、解決はしなかった。かなり絶望した。
だめもとでエンコードをutf-8に明に指定(そもそもデフォルトでutf-8になっているらしい)してみるも、やはり解決はしない。 - 文献をいろいろ見てみて、”使用できる日本語フォントを指定”という文言がひっかかり、そもそもこのゲストOSのLinux上で使用できる日本語フォントって何だろう?と思って確認
→しかし出てこない →日本語フォントをインストールして再度図形を作成
→解決!!
という流れだった。
最後の具体的な解決の流れは、まずは日本語フォントの確認のために、
fc-list :lang=ja
にて日本語フォントで使用できるものがあるか確認するも、何も出力されなかった。そのため、使用できる日本語フォントがないことがわかる。
そこで、なんでもいいから日本語フォントをインストールしようと、また別のサイト *5 を参考に、下記コマンドにて日本語フォントを導入してみた。
# yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
改めと先述のコマンドで確認してみても、導入されてるっぽい
# fc-list :lang=ja /usr/share/fonts/ipa-gothic/ipag.ttf: IPAGothic:style=Regular /usr/share/fonts/ipa-mincho/ipam.ttf: IPAMincho:style=Regular /usr/share/fonts/ipa-pmincho/ipamp.ttf: IPAPMincho:style=Regular /usr/share/fonts/ipa-pgothic/ipagp.ttf: IPAPGothic:style=Regular
以上を実施して再度図形を作成してみたら、無事に文字化けが修正されていた。
ちなみに、下記コードのようにdotファイル内にてフォントを指定しなくても、文字化けは発生しなかった。
digraph sample { "テスト" }
実際に作成された図形がこちら
以上でどうにか無事に解決しました。
参考文献
Scala:ScalaでPythonのtypeみたいに変数型を確認して表示する
PythonでTypeで変数型を表示するように、Scalaでも変数型を調査・確認して表示する方法を調査していて、地味に見つけるのに時間がかかったので備忘としてメモを残します。
結論を言うと、getClass
を使用することで、変数の型を取得することができます。コードとしては以下のようになります。
変数名.getClass
実際に自分で作成したClass型を使用している変数を含む変数型を調査したコードとその結果は以下のようになります。
コード
//独自Classの定義 case class profile(name:String,age:Int,height:Double) case class license(name:String,age:Int) //調査対象の変数の作成 val value_int = 123 val value_double = 123.0 val value_string = "abc" val value_profile=profile("aa",1,2.0) val value_license=license("aa",1) //各変数の型の調査と表示 println(value_int.getClass) println(value_double.getClass) println(value_string.getClass) println(value_profile.getClass) println(value_license.getClass)
出力結果
# scala Z001_type.scala int double class java.lang.String class Main$$anon$1$profile class Main$$anon$1$license
上記の通り、一通りの変数の型を調査して表示させることができました。独自Classの表示内容の詳細な意味が調べ切れていませんが、独自Classということは特定できているようです。