是否有可能使用 csv 文件中包含的一些数据在 pgfgantt 图表中创建里程碑或条形图?如果可以,该怎么做?使用 csvsimple 可以实现吗?能否举一个小例子?
谢谢
好的,按照帖子252308(谢谢蝉),这给出了类似这样的结果:
\usepackage{pgfgantt}
\usepackage{xcolor}
\usepackage[utf8]{inputenc}
\usepackage{pgfplotstable}
\pgfplotstableset{col sep=comma}
\begin{filecontents}{data.csv}
column1,column2
1,5
2,4
3,7
\end{filecontents}
\definecolor{barblue}{RGB}{153,204,254}
\definecolor{groupblue}{RGB}{51,102,254}
\definecolor{linkred}{RGB}{165,0,33}
\begin{document}
\pgfplotstableread{data.csv}\data
\pgfplotstablegetelem{1}{column2}\of{\data}
\begin{ganttchart}{1}{12}
\gantttitle{2011}{12} \\
\gantttitlelist{1,...,12}{1} \\
\ganttgroup{Group 1}{1}{7} \\
\ganttbar{Task 1}{1}{2} \\
\ganttlinkedbar{Task 2}{3}{7}
\ganttnewline
\ganttmilestone{Milestone}{7}
\ganttnewline
\ganttbar{Final Task}{8}{12}
\ganttlink{elem2}{elem3}
\ganttlink{elem3}{elem4}\\
\ganttmilestone{Milestone}{\pgfplotsretval}
\end{ganttchart}
\end{document}
对于一个单点来说这是没问题的...但是如何自动添加所有数据?
假设 csv 文件对应于以下内容:
\begin{filecontents}{data.csv}
task, date
task1,01-08-2022
task2,05-08-2022
task3,20-08-2022
\end{filecontents}
如何自动加载所有数据以获得与此等效的内容:
\ganttmilestone{task1}{01-08-2022}
\ganttmilestone{task2}{05-08-2022}
\ganttmilestone{task3}{20-08-2022}
答案1
使用 expl3 的 IO 和映射功能将里程碑文件数据添加到 pgfgantt 图表的示例。
甘特图和文件数据必须排列在同一时间段内才能有意义地显示(在月、周或日级别上使用 2022 年数据的 2011 年图表并不实用)。
平均能量损失
\begin{filecontents*}{mdata.csv}
task, date
task1,01-08-2022
task2,05-08-2022
task3,20-08-2022
\end{filecontents*}
\documentclass{article}
\usepackage{pgfgantt}
\usepackage{xcolor}
\definecolor{barblue}{RGB}{153,204,254}
\definecolor{groupblue}{RGB}{51,102,254}
\definecolor{linkred}{RGB}{165,0,33}
\ExplSyntaxOn
\tl_new:N \g_gc_milestonename_tl
\tl_new:N \g_gc_milestonedate_tl
\seq_new:N \g_gc_milestonelist_seq
%++++++++++++++++++++++++++
\cs_generate_variant:Nn
\seq_gset_split:Nnn
{ Nno }
\cs_generate_variant:Nn
\seq_set_split:Nnn
{ Nno }
%****************************************************
%*
%****************************************************
%------------------
\cs_set:Npn \ic_funcmilestone:n #1 {
% 1=data line :: task1,01-08-2022
\seq_set_split:Nno
\l_tmpa_seq
{ , }
{ #1 }
%milestone name
\tl_gset:Nx
\g_gc_milestonename_tl
{
\seq_item:Nn
\l_tmpa_seq
{ 1 }
}
%milestone date
\tl_gset:Nx
\g_gc_milestonedate_tl
{
\seq_item:Nn
\l_tmpa_seq
{ 2 }
}
%add to chart
\ganttmilestone
{ \g_gc_milestonename_tl }
{ \g_gc_milestonedate_tl }
\ganttnewline
}
%****************************************************
%*
%****************************************************
%------------------
\cs_set:Npn \ic_funcgline:n #1 {
% 1=line from file
%add it to the list
\tl_set:Nx \l_tmpa_tl { #1 }
\seq_gput_right:NV
\g_gc_milestonelist_seq
\l_tmpa_tl
}
%io stream name
\ior_new:N \g_gc_getfile_ior
\NewDocumentCommand { \getfilemilestones } { m }
{% #1 = file name
\seq_gclear:N \g_gc_milestonelist_seq
%read the milestone data
\ior_open:Nn \g_gc_getfile_ior { #1 }
\ior_map_inline:Nn
\g_gc_getfile_ior
{
\ic_funcgline:n { ##1 }
}
\ior_close:N \g_gc_getfile_ior
% \seq_show:N \g_gc_milestonelist_seq
%remove header
\seq_gset_eq:NN
\g_tmpa_seq
\g_gc_milestonelist_seq
\seq_pop_left:NN
\g_tmpa_seq
\l_tmpb_tl
%add milestones to chart
\seq_map_function:NN
\g_tmpa_seq
\ic_funcmilestone:n
}
\ExplSyntaxOff
\begin{document}
\begin{ganttchart}[
x unit=4mm,
time slot format=little-endian,
]{01-08-2022}{31-08-2022}
\gantttitlecalendar{year, month, day} \\
\getfilemilestones{mdata.csv}
\ganttnewline
\end{ganttchart}
\end{document}