Tell me more ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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]]}];
share|improve this question

2 Answers

up vote 5 down vote accepted

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}}]
share|improve this answer
2  
Or DateListPlot[data[[;;, {1, #}]] & /@ {2,3,4}, Joined -> True, Filling -> {3 -> {1}}] – belisarius Jan 25 at 19:41
@belisarius Yes, but only in his specific case ;) – Vitaliy Kaurov Jan 25 at 19:42
@VitaliyKaurov Not now – belisarius Jan 25 at 19:42
@stevenvh Thanks. I did almost the same than Vitaliy and he posted earlier. I don't think the small difference deserves another answer – belisarius Jan 25 at 19:44
@stevenvh I put it back ;) – Vitaliy Kaurov Jan 25 at 19:45

Another variation, not as readable as Vitaliy's:

DateListPlot[Transpose[Tuples[{{#1}, {##2}}] & @@@ data], 
 Joined -> True, Filling -> {3 -> {1}}]

To multiple the second column by 2 just insert a multiplier list in front of {##2}:

DateListPlot[Transpose[Tuples[{{#1}, {2, 1, 1} {##2}}] & @@@ data], 
 Joined -> True, Filling -> {3 -> {1}}]
share|improve this answer
Simon, I love your style. Unfortunately it's mine too! I wrote the exact same code as your first line. :^) (Well, I use # rather than #1 but that's splitting hairs.) – Mr.Wizard Jan 26 at 7:04
@Mr.Wizard, I find this happens quite a lot the other way round :-) – Simon Woods Jan 26 at 17:56
I now know who to contact if I want to work on project with someone. – Mr.Wizard Jan 26 at 18:01

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.