私はpgf
オンザフライでプロットを生成しており、y ticks
すべての を維持しながら、プロットに非整数を追加しないようにしたいと考えていますx ticks
。これが MWE です:
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{amsmath}
\usepackage{siunitx}
\usepackage{amssymb}
\usepackage{pgfplotstable}
\usepackage[active, pdftex, tightpage]{preview}
\PreviewEnvironment[{[]}]{tikzpicture}
\setlength\PreviewBorder{2mm}
\begin{filecontents}{PJxpGrZtwos.tex.dat}
N f M
1024 3.407938e+01 25
1536 1.339487e+01 20
2048 1.139487e+01 19
3072 8.351236e+00 14
4049 6.466788e+00 13
6144 4.466788e+00 11
\end{filecontents}
\pgfkeys{/pgf/fpu=true}
\pgfplotstableread{PJxpGrZtwos.tex.dat}\loadedtable
\pgfplotstablegetelem{0}{N}\of{\loadedtable}
\let\relativeTo\pgfplotsretval
\pgfplotstablegetelem{0}{f}\of{\loadedtable}
\let\f\pgfplotsretval
\pgfplotstablecreatecol[create col/expr={\f / \thisrow{f}}]{f-relative}\loadedtable
\pgfkeys{/pgf/fpu=false}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[axis y line*=left, legend pos=south east,xlabel={N},xtick=data, xticklabels from table={\loadedtable}{N},ytick=data, yticklabel=\pgfmathparse{exp(\tick)}\pgfmathprintnumber{\pgfmathresult}, ylabel ={$\dfrac{f(\pgfmathprintnumber\relativeTo)}{f(N)}$}]
\addplot[black] table[x=N, y expr=\thisrow{N}/\relativeTo] {\loadedtable};
\addplot[blue, mark=*] table[x=N, y=f-relative] {\loadedtable};
\legend{{Linear progression},}
\end{loglogaxis}
\begin{semilogxaxis}[ymin = 5, ytick={10, 15, ..., 30}, ymax = 35, axis x line=none,ylabel={\# M}, axis x line=none, axis y line*=right, ylabel near ticks=right, yticklabel pos=right]
\addplot[red, dotted, mark=x, mark options={solid}] table[x=N, y=M] {\loadedtable};
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
ここで私が望むのは、をすべて保持しながら、の非整数値を\addplot[black] table[x=N, y expr=\thisrow{N}/\relativeTo] {\loadedtable};
加算しないことです。y ticks
\thisrow{N}/\relativeTo
x ticks
(x_min, 1) から (x_max, x_max/x_min) への線形関数を描画する他の方法があり、適切な対応がある場合y ticks
(別のテーブルを作成するなど)、それも機能します。
これは「オンザフライ」のプロット生成用であり、事前に値がわからないため、この場合は使用できないことに注意してくださいy tick={1,...,6}
。
答え1
いくつかの if 条件を使用して、目盛りラベルに許容範囲を導入できます。
\documentclass{standalone}
\usepackage{amsmath,amssymb,siunitx}
\usepackage{pgfplotstable}
\begin{filecontents}{PJxpGrZtwos.tex.dat}
N f M
1024 3.407938e+01 25
1536 1.339487e+01 20
2048 1.139487e+01 19
3072 8.351236e+00 14
4049 6.466788e+00 13
6144 4.466788e+00 11
\end{filecontents}
\pgfkeys{/pgf/fpu=true}
\pgfplotstableread{PJxpGrZtwos.tex.dat}\loadedtable
\pgfplotstablegetelem{0}{N}\of{\loadedtable}
\let\relativeTo\pgfplotsretval
\pgfplotstablegetelem{0}{f}\of{\loadedtable}
\let\f\pgfplotsretval
\pgfplotstablecreatecol[create col/expr={\f / \thisrow{f}}]{f-relative}\loadedtable
\pgfkeys{/pgf/fpu=false}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[
axis y line*=left,
legend pos=south east,
xlabel={N},
xtick=data,
xticklabels from table={\loadedtable}{N},
ytick=data,
yticklabel={
\pgfmathparse{abs(exp(\tick) - int(exp(\tick)))}
\ifdim\pgfmathresult pt>0.999 pt
\pgfmathparse{exp(\tick)}
\pgfmathprintnumber{\pgfmathresult}
\else
\ifdim\pgfmathresult pt<0.01 pt
\pgfmathparse{exp(\tick)}
\pgfmathprintnumber{\pgfmathresult}
\else{}
\fi
\fi
},
ylabel ={$\dfrac{f(\pgfmathprintnumber\relativeTo)}{f(N)}$}]
\addplot[black] table[x=N, y expr=\thisrow{N}/\relativeTo] {\loadedtable};
\addplot[blue, mark=*] table[x=N, y=f-relative] {\loadedtable};
\legend{{Linear progression},}
\end{loglogaxis}
\begin{semilogxaxis}[ymin = 5, ytick={10, 15, ..., 30}, ymax = 35, axis x line=none,ylabel={\# M}, axis x line=none, axis y line*=right, ylabel near ticks=right, yticklabel pos=right]
\addplot[red, dotted, mark=x, mark options={solid}] table[x=N, y=M] {\loadedtable};
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
答え2
明らかな解決策が見つかりました。「ytick=data」の部分を削除するだけです。何か誤解しているのでしょうか?
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{pgfplotstable}
\usepackage[active, pdftex, tightpage]{preview}
\PreviewEnvironment[{[]}]{tikzpicture}
\setlength\PreviewBorder{2mm}
\begin{filecontents}{Dkb0rjC9L.tex.dat}
x y
1 1
2 1.5
3 2
4 3
5 4
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xtick=data]
\addplot table {Dkb0rjC9L.tex.dat};
\end{axis}
\end{tikzpicture}
\end{document}