メッシュ プロットの線凡例

メッシュ プロットの線凡例

関連する曲線のグループ プロットを作成しています。曲線はパラメーターによって関連しているため、そのパラメーター (の関数) に従って色を付けたいと考えています。そのために、メッシュ オプションを使用し、ポイント メタを使用して色を指定しました。ただし、凡例はメッシュ グリッドであるため、色付きの線にしたいです。これを行う最もクリーンな方法は何ですか?

関連する投稿を見つけましたメッシュプロットのマーカー付き凡例しかし、私の場合にはそれを適応させることができませんでした。

 \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 legendafter を配置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 marksmark=none

カラーマップのカスタムルックアップの関連アプリケーションも参照してください。 TikZ を使ってヒートマップを描く


これらすべてを実装した今、私は後ろ向きになって、cycle lists を使用してユースケースを再実装した方がはるかに役立つかもしれないことに気付きました。これらのリストは、pgfplots がさまざまな色を処理する一般的な方法です。これらは使いやすく、凡例に関しては完全にサポートされています。 の方がcycle lists良いと思われる場合 (カラーマップが本当に必要な場合はそうではありません)、pgfplots マニュアルで詳細情報を確認できます。

関連情報