Skip to main content

list manipulation - Selecting multiple columns from a matrix?


Sample data:


data = {
{{2013, 1, 1}, 24.13, 167.67, 231.82},
{{2013, 1, 2}, 32.15, 170.92, 225.99},

{{2013, 1, 3}, 35.43, 172.68, 221.67},
{{2013, 1, 4}, 36.73, 173.05, 218.32},
{{2013, 1, 5}, 58.19, 165.96, 197.05},
{{2013, 1, 6}, 69.99, 163.50, 187.52},
{{2013, 1, 7}, 71.37, 154.21, 175.58},
{{2013, 1, 8}, 72.51, 149.66, 163.25}};

I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code:


data2 = Transpose[{data[[All, 1]], data[[All, 2]]}];
data3 = Transpose[{data[[All, 1]], data[[All, 3]]}];

data4 = Transpose[{data[[All, 1]], data[[All, 4]]}];
DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}]

but I have a hunch that this can be done more efficiently. I don't like the Transposes in particular. Any ideas?



edit (for extra credit)
What if I need to multiply the second column by 2, which in my solution is simply


data2 = Transpose[{data[[All, 1]], 2 * data[[All, 2]]}];

Answer



This method allows you to define arbitrary column indexes, not necessarily that orderly as you have. Just put them in the list:



iNeed = {{1, 2}, {1, 3}, {1, 4}};

then this will do the job and make a plot identical to yours:


DateListPlot[data[[All, #]] & /@ iNeed, Joined -> True, Filling -> {3 -> {1}}]

basically it does this but in a shorter way:


DateListPlot[{
data[[All, {1, 2}]],
data[[All, {1, 3}]],
data[[All, {1, 4}]]

}, Joined -> True, Filling -> {3 -> {1}}]

Comments