我如何更改節點的大小以在其中添加一些文字。下面是程式碼,第二個圖是根據該程式碼產生的。
\begin{figure}
\usetikzlibrary{trees}
\begin{tikzpicture}[sibling distance=2.8cm,level distance=2.8cm,
box/.style={
shape=rectangle,
font=\small,
draw,
align=center,
minimum height=1.5cm,
text width=1.75cm,
top color=white,
bottom color=blue!20}
]
\node [box,text width=3cm] {Indoor\\Localization\\System} [edge from parent fork down]
child { node [box] {Proximity} }
child { node [box] {Angulation}
child { node [box] {Received Angle}
child [sibling distance=2.2cm] { node [box] {AOA}
child [sibling distance=2.2cm] { node [box] {Antenna array} }}}}
child { node [box] {Scene Analysis} }
child [sibling distance=3cm] { node [box] (lat) {Lateration}
child [sibling distance=4.5cm] { node [box] {Propagation time}
child [sibling distance=2.2cm] { node [box] {TOA}
child [sibling distance=2.2cm] { node [box] {RF or ultrasonic} }}
child [sibling distance=2.2cm] { node [box] {TDOA}
child [sibling distance=2.2cm] { node [box] {RF or Ultrasonic} }} }
child [sibling distance=3.4cm]{ node [box] (tof) {Signal Strength}
child [sibling distance=2.2cm] { node [box] {RSS}
child [sibling distance=2.2cm] { node [box] {RF} }}} };
\end{tikzpicture}
\caption{Overview of Localization}
\end{figure}
答案1
使用您的程式碼我無法重現您的圖像。看起來不錯。不管怎樣,我稍微減少了你的代碼並選擇了新的兄弟距離。透過此更改,我得到以下圖片:
\documentclass[tikz, border=3mm]{standalone}
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}[sibling distance=2.8cm,level distance=2.8cm,
box/.style={
shape=rectangle,
font=\small,
draw,
align=center,
minimum height=1.3cm,
text width=1.75cm,
top color=white,
bottom color=blue!20},
level 1/.style = {sibling distance=2.6cm},
level 2/.style = {sibling distance=3.4cm},
level 3/.style = {sibling distance=2.4cm},
]
\node [box,text width=3cm] {Indoor\\Localization\\System} [edge from parent fork down]
child { node [box] {Proximity} }
child { node [box] {Angulation}
child { node [box] {Received Angle}
child { node [box] {AOA}%sibling distance=2.2cm
child { node [box] {Antenna array} }}}}%[sibling distance=2.2cm]
child { node [box] {Scene Analysis} }
child { node [box] (lat) {Lateration}%[sibling distance=3cm]
child { node [box] {Propagation time}%[sibling distance=4.5cm]
child { node [box] {TOA}%[sibling distance=2.2cm]
child { node [box] {RF or ultrasonic} }}%[sibling distance=2.2cm]
child [sibling distance=2.2cm] { node [box] {TDOA}
child { node [box] {RF or Ultrasonic} }} }%[sibling distance=2.2cm]
child { node [box] (tof) {Signal Strength}%[sibling distance=3.4cm]
child { node [box] {RSS}%[sibling distance=2.2cm]
child { node [box] {RF} }}} };%[sibling distance=2.2cm]
\end{tikzpicture}
\end{document}
在程式碼中,我註解了所有同級距離,而不是用level
樣式定義它們。
答案2
這個答案說明了兩件事:
那一個森林解決方案無需手動指定兄弟距離 - 樹會自動打包以創建緊湊而簡潔的形式;
那個實驗包正義樹可用於新增原始圖表右側顯示的標籤和森林可以自動添加箭頭。
我不知道你是否對標籤感興趣,因為你沒有提到它,但我需要測試用例,所以不妨在我這樣做時給粗心的人造成結果。
如果您想在家中嘗試此操作,請告訴我您想要一份副本,因為它尚未現成(即不在 CTAN 上)。
這是結果,以便您可以決定是否繼續閱讀。我不知道最上面的箭頭是否應該與其他箭頭或它指向的節點對齊。我選擇了後者,但前者只需要稍作修改。
最大的優點是森林是它在繪製樹時提供的強大功能和靈活性,尤其是自動化和一致格式的潛力。預設情況下它也會繪製非常緊湊的樹。
正義樹是一個森林包裝器旨在完成一件事:自動在樹的左側或右側對齊標籤,允許將標籤內容指定為樹的一部分,並提供幾個按鍵來自訂標籤的格式。
前言
載入程式碼:
\usepackage{justtrees}% v 0.07
對於箭頭提示:
\usetikzlibrary{arrows.meta}
我們將使用該edges
庫,因為它允許我們輕鬆獲得edge from parent fork down
.
\useforestlibrary{edges}
應用edges
預設設定。如果您不希望它應用於forest
文件中的每棵樹,請在本機 TeX 範圍內執行此操作。
\forestapplylibrarydefaults{edges}
身體
正義樹提供了一個新的環境justtree
,它採用一個強制參數來提供樹的序言。這可以為空,但參數不能省略。
\begin{justtree}
{
為了得到邊緣的方形轉彎。
forked edges,
我們希望將一些東西應用於樹中的每個節點。這本質上是box
為了相容性而對您的樣式進行了輕微修改。
for tree={
font=\small,
draw,
align=center
我們需要的不是這個。 (不過,我不確定為什麼。)
text centered,
minimum height=1.5cm,
text width=1.75cm,
我們需要這個來保持一致。
anchor=north,
top color=white,
bottom color=blue!20,
如果我們想要無文字。否則,省略。
font=\sffamily,
},
這是右側標籤的格式。我們將它們向右移動,為箭頭留出空間。
just format={xshift=25pt, font=\sffamily},
這段程式碼負責繪製箭頭。我們延遲它以確保主樹中所有節點的位置都已計算出來,這樣我們的箭頭就不會出現在意想不到的地方。
before drawing tree={
這有點複雜。它有效,但我不確定它是否正確。這本手冊需要為像我這樣的白痴提供更簡單的範例(或只是一些範例);)!
它從一個節點走到另一個節點,並在每一步執行一些操作。r
是樹的根。L
是最後一個葉子,即右下節點。current and ancestors
然後從最後一個葉子向上移動到根,即右下節點 -> 父節點 -> 祖父母 -> 曾祖父母 -> ... -> 根。
for nodewalk={rL,current and ancestors}{
我們不需要級別0
或1
樹的箭頭。 (0
使用 時,級別實際上是不可見的justtree
。)因此,我們在每一步測試當前級別,如果它小於2,則不執行任何操作,否則繪製箭頭,將其與適當的錨點對齊,以與最終將在右側節點和當前節點。
if={level()<2}{}{tikz+={\draw [Stealth-] (.mid east) ++(2.5pt,0) -- ++(15pt,0);},},
},
},
}
這是序言。現在樹在森林的括號表示法。請注意,我們可以為節點新增常規 TikZ 選項,森林將把它們傳遞下去。
[Indoor\\Localization\\System, text width=3cm
右側的標籤是使用 指定的just=<label content>
。它只需要傳遞到正確層級的節點 - 哪個節點並不重要。
[Proximity, just={Positioning}
]
[Angulation
[Received\\Angle
[AOA
[Antenna\\array
]
]
]
]
[Scene\\Analysis
]
[Lateration
還有幾個標籤。
[Propagation\\time, just=Variable
[TOA
[RF or\\ultrasonic, just=Device
]
]
[TDOA
[RF or\\Ultrasonic
]
]
]
[Signal\\Strength
最終標籤。它們分散在樹中只是為了表明它們被指定在哪裡並不重要。
[RSS, just=Ranging
[RF
]
]
]
]
]
關閉環境,我們就完成了。
\end{justtree}
完整程式碼:
\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{justtrees}% v 0.07
\usetikzlibrary{arrows.meta}
\useforestlibrary{edges}
\forestapplylibrarydefaults{edges}
\begin{document}
\begin{justtree}
{
forked edges,
for tree={
font=\small,
draw,
text centered,
minimum height=1.5cm,
text width=1.75cm,
anchor=north,
top color=white,
bottom color=blue!20,
font=\sffamily,
},
just format={xshift=25pt, font=\sffamily},
before drawing tree={
for nodewalk={rL,current and ancestors}{
if={level()<2}{}{tikz+={\draw [Stealth-] (.mid east) ++(2.5pt,0) -- ++(15pt,0);},},
},
},
}
[Indoor\\Localization\\System, text width=3cm
[Proximity, just={Positioning}
]
[Angulation
[Received\\Angle
[AOA
[Antenna\\array
]
]
]
]
[Scene\\Analysis
]
[Lateration
[Propagation\\time, just=Variable
[TOA
[RF or\\ultrasonic, just=Device
]
]
[TDOA
[RF or\\Ultrasonic
]
]
]
[Signal\\Strength
[RSS, just=Ranging
[RF
]
]
]
]
]
\end{justtree}
\end{document}