背景
のデータセクションに次のようなデータがあると仮定しますdatavisualization
。これはファイルから取得することもできます。
date,birds
30/10/2023,1200
02/10/2023,1229
...
または
species,birds
spec4,1200
spec1,1229
...
\datavisualization
は、 と の 2 つの視覚化を提供しますscientific axes
がschool book axes
、どちらも xy データが必要です。
質問
テキストの x データをカウンターに置き換えて、単純な順序尺度を導入するのは、大したことではありません。しかし、元の x データを保持またはアクセスし、それらを 1、2、... ではなく x 軸のラベルとして配置するにはどうすればよいでしょうか。
試み
以下のコードは\pgfdeclaredataformat{ordinalX}
、x データを単純なカウンター NX に置き換える を提供します。
私は私を知っていますできたたとえば、 を介して、リストをticks={major at={1 as spec4,...}}
x 軸ステートメントに手動で書き込みます。ただし、データ セクションで既に与えられているデータを処理する場合、これは良いアイデアではありません。
ここで使用されているデータの範囲、アクセス、データ構造、さらには pgfmanual だけから正しい pgfkey を推測することさえ、私には全くわからないようですdatavisualization
。
これは、pgfkeys、l3、「配列」、データ オブジェクトなどのグローバル変数を導入することによってのみ解決できますか。また、その場合、宣言された形式によって、抽出された元の x データがそこに配置されますか。
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{datavisualization}
\newcounter{NX}
% ~~~ introducing ordinal values for x ~~~~~~~~~
% converts (date,birds) into (NX,birds) in (x,y) world
\pgfdeclaredataformat{ordinalX}
{}
{}
{#1,#2}
{ % ~~~ new x-values: one-by-one ~~~~~~~~~
\pgfmathaddtocounter{NX}{1}
\pgfkeyssetvalue{/data point/x}{\theNX}
% ~~~ preserving the y-data ~~~~~~~~~~~~
\pgfkeyssetvalue{/data point/y}{#2}
% ~~~ original x-data, to be treated as labels ~~~~
\pgfkeyssetvalue{/data point/mylabel}{#1}
% ~~~ storing NX, y and (?) mylabel ~~~~~
\pgfdatapoint
}
{}{}
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\begin{document}
\begin{tikzpicture}
\datavisualization [
scientific axes=clean,
x axis={label=X,
ticks={label=mylabel} % can't put date as labels
}, % rather it likes a list ?from data section?
y axis={label=birds},
all axes=grid,
][
visualize as line,
] data [format=ordinalX] {
% date,birds % skipping header
30/10/2023,1200
02/10/2023,1229
06/11/2023,980
09/11/2023,570
13/11/2023,308
16/11/2023,2590
20/11/2023,11700
}
% TEST / Bypass ?
% ~~~ if I had access to, say, /data point/mylabel here ...
% I might be able to iterate and place date as labels
info{
\foreach \x in {1,2,...,7}
\node[rotate=90,anchor=east,teal]
at (visualization cs: x={\x},y={-2e3}) {X-label};
}
;
\end{tikzpicture}
\end{document}
答え1
私はそれを利用して適応することで解決策を見つけました2013年のジェイクの解決策。 キーポイント:
- ほとんどのことは声明の中で起こる
x axis={..., ticks={...
- それは
typesetter
styles the nodes
ラベル用(回転など)- タイプセッターは
global TeX list
配列のように機能するに依存している - 宣言されたフォーマット内で、
ordinalX
上記appends
のリストに - 私は
LaTeX counter
の代わりにを使いますpredefined TeX \@tempcnta
。StackExchangeでこちらを参照 \makeatletter
含まれていますが\makeatother
、おそらく使用されているカウンターが異なるため、効果がないようです。
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{datavisualization}
\newcounter{NX} % <<< using LaTeX counter istead of \@tempcnta
\makeatletter
% ~~~ introducing ordinal values for x ~~~~~~~~~
% converts (date,birds) into (NX,birds) in (x,y) world
\pgfdeclaredataformat{ordinalX}%
{} % No catcode changes
{\xdef\label@list{}}% initialise a global label list
{#1,#2}% data format
{%
\pgfmathaddtocounter{NX}{1}% advance
\pgfkeyssetvalue{/data point/x}{\theNX}%store counters result as x-data
\pgfkeyssetvalue{/data point/y}{#2}% the y-data (birds)
\xdef\label@list{\label@list,"#1"}% append label to list
\pgfdatapoint
}%
{}{}
% ~~~ typesetting the x-axis: putting labels instead of 1,2,3, ... ~~~~~~~~
\def\ticksfromlabellist#1{%
\pgfmathparse{{\label@list}[#1]}% retrieve label one by one
\pgfmathresult% result: text, i.e. 30/10/2023
}
\makeatother
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\begin{document}
\begin{tikzpicture}
\datavisualization [
scientific axes=clean,
x axis={
label=Date,
ticks={ % NEW
step=1,
tick typesetter/.code=\ticksfromlabellist{##1}, % typesetting labels, replacing 1,2,3,...
% style={text height=1ex}, % for proper vertical alignment
node style={rotate=90,anchor=east,teal}, % rotating etc.
}
},
y axis={label=birds},
all axes=grid,
][
visualize as line,
] data [format=ordinalX] {
% date,birds % skipping header
30/10/2023,1200
02/10/2023,1229
06/11/2023,980
09/11/2023,570
13/11/2023,308
16/11/2023,2590
20/11/2023,11700
};
\end{tikzpicture}
\end{document}