
関連する曲線のグループ プロットを作成しています。曲線はパラメーターによって関連しているため、そのパラメーター (の関数) に従って色を付けたいと考えています。そのために、メッシュ オプションを使用し、ポイント メタを使用して色を指定しました。ただし、凡例はメッシュ グリッドであるため、色付きの線にしたいです。これを行う最もクリーンな方法は何ですか?
関連する投稿を見つけましたメッシュプロットのマーカー付き凡例しかし、私の場合にはそれを適応させることができませんでした。
\begin{tikzpicture}
\begin{groupplot}[group style={group size={2 by 1},
xlabels at=edge bottom,
xticklabels at=edge bottom},
axis lines=left, domain=-5:5,
xlabel=$x$,
width=0.5\textwidth,colormap/hot,
legend columns=-1,
legend entries={ $\beta=0.1$, $\beta=0.5$,
$\beta=0.8$, $\beta=1.0$, $\beta=2.0$, $\beta=5.0$},
legend to name={fig:mm_temp_legend}]
]
\nextgroupplot[ylabel={$p(x)$}]
\pgfplotsforeachungrouped \be/\zedd in {
0.1/12.4595,
0.5/18.3263,
0.8/29.6888,
1.0/43.0372,
2.0/403.539,
5.0/1.07923e6 } {
\addplot+[line legend,samples=200,no marks,solid,mesh,point meta={ln(\be)}]
gnuplot {exp(\be*(0.4*(x-0.3)**2-0.02*x**4))/\zedd};
}
%
\nextgroupplot[ylabel={$-\log p(x)$},ymin=0]
\pgfplotsforeachungrouped \be/\zedd in {
0.1/12.4595,
0.5/18.3263,
0.8/29.6888,
1.0/43.0372,
2.0/403.539,
5.0/1.07923e6 } {
\addplot+[samples=200,no marks,solid,mesh,point meta={ln(\be)}]
gnuplot {\be*(-0.4*(x-0.3)**2+0.02*x**4)+log(\zedd)};
}
\end{groupplot}
\end{tikzpicture}
答え1
あなたが達成しようとしていることは可能です。しかし、それは実際には機能要求に近いものです (それが困難をもたらす理由を説明しています)。
問題は伝説がない関連するプロットと同じカラー データ (別名「ポイント メタ」) 値を持ちます。そして、私の観点からすると、これは実際に期待されるものです。あなたの例では、point meta
色を定義するために を使用しており、それが便利であることがわかります。ただし、凡例は結果の色を知ることはできません。
凡例にカラー マッピングがないことは、このアプローチに固有の問題です。ただし、line legend
after を配置mesh
すると、線の凡例 (上記の理由により間違った色で) が生成されます。
あなたの例では実際に生成される二凡例の後のオプション\begin{groupplot}
は両方次の軸。
そうは言っても、比較的単純な API 呼び出しで機能要求を満たすことができます。pgfplots には公開された基本レベル API がないため、このコマンドは文書化されていません。このコマンドはスカラー値を何らかのカラー マップにマッピングします。
それぞれの可能な値に1つの色を定義するというアイデアです。ln(\be)
あらかじめこれらの定義済み色を後で使用するには:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.7}
\usepgfplotslibrary{groupplots}
\begin{document}
\thispagestyle{empty}
\pgfplotsset{
colormap/hot,
}%
\pgfmathparse{ln(0.1)}%
\let\BEMIN=\pgfmathresult
\pgfmathparse{ln(5)}%
\let\BEMAX=\pgfmathresult
% FIRST: define one color for every value of \be :
\pgfplotsforeachungrouped \be in {
0.1,
0.5,
0.8,
1.0,
2.0,
5.0} {
\pgfmathparse{ln(\be)}
\let\value=\pgfmathresult
%
\pgfplotscolormapaccess
[\BEMIN:\BEMAX]% IMPORTANT for the mapping.
{\value}
{\pgfkeysvalueof{/pgfplots/colormap name}}
% now, \pgfmathresult contains {<R>,<G>,<B>}
%
\edef\temp{\noexpand\definecolor{be color \be}{rgb}{\pgfmathresult}}%
%
% now, \temp contains '\definecolor{be color 0.1}{rgb}{<R>,<G>,<B>}'
\temp
}
\begin{tikzpicture}
\begin{groupplot}[group style={group size={2 by 1},
xlabels at=edge bottom,
xticklabels at=edge bottom},
axis lines=left, domain=-5:5,
xlabel=$x$,
width=0.5\textwidth,%colormap/hot,
legend columns=-1,
]
]
\nextgroupplot[ylabel={$p(x)$},
% HINT: I added 'legend entries here as opposed to the environment:
% only ONE sub-plot should have legend, not both
legend entries={ $\beta=0.1$, $\beta=0.5$,
$\beta=0.8$, $\beta=1.0$, $\beta=2.0$, $\beta=5.0$},
legend to name={fig:mm_temp_legend},
]
\pgfplotsforeachungrouped \be/\zedd in {
0.1/12.4595,
0.5/18.3263,
0.8/29.6888,
1.0/43.0372,
2.0/403.539,
5.0/1.07923e6 } {
% NOTE: I replaced 'no marks' by 'mark=none'. Seems as if 'no
% marks' does not make it into the legend (!?)
%
% this \edef\temp is required to expand 'draw=be color \be' to
% 'draw=be color 0.1' etc:
\edef\temp{%
\noexpand\addplot+[draw=be color \be,id=\be,samples=200,mark=none,solid,]
gnuplot {exp(\be*(0.4*(x-0.3)**2-0.02*x**4))/\zedd};
}%
\temp
}
%
\nextgroupplot[ylabel={$-\log p(x)$},ymin=0]
\pgfplotsforeachungrouped \be/\zedd in {
0.1/12.4595,
0.5/18.3263,
0.8/29.6888,
1.0/43.0372,
2.0/403.539,
5.0/1.07923e6 } {
\addplot+[id=2_\be,samples=200,no marks,solid,mesh,point meta={ln(\be)}]
gnuplot {\be*(-0.4*(x-0.3)**2+0.02*x**4)+log(\zedd)};
}
\end{groupplot}
\end{tikzpicture}
\ref{fig:mm_temp_legend}
\end{document}
重要なステップは、値の下限と上限を計算することですln(\be)
。そうしないとマッピングが不可能になります。実際のループには、基本的な拡張制御が少し含まれています。比較してみましょう。LaTeX プログラミングはどこから始めればよいですか?詳細については。
コマンド\addplot+
も展開する必要があります。展開しないと、\be
値が失われます。これは、が( より前ではなく )draw=...
で開始される「視覚化フェーズ」で評価されるためです。および は、 に依存する展開されていない値のみを記憶します。\end{groupplot}
draw=...
\be
比較を簡単にするために、2 番目のプロットはそのまま残しました。この回答がニーズに合っている場合は、それを採用することもできます。
私のマシンで gnuplot を繰り返し呼び出すのを避けるためにを追加し、 をにid=...
置き換える必要があったことに注意してください(後者は pgfplots のバグまたはユーザビリティの問題のようです。対処します)。no marks
mark=none
カラーマップのカスタムルックアップの関連アプリケーションも参照してください。 TikZ を使ってヒートマップを描く
これらすべてを実装した今、私は後ろ向きになって、cycle list
s を使用してユースケースを再実装した方がはるかに役立つかもしれないことに気付きました。これらのリストは、pgfplots がさまざまな色を処理する一般的な方法です。これらは使いやすく、凡例に関しては完全にサポートされています。 の方がcycle lists
良いと思われる場合 (カラーマップが本当に必要な場合はそうではありません)、pgfplots マニュアルで詳細情報を確認できます。