Take the 2-minute tour ×
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
add comment

2 Answers 2

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 '13 at 19:41
    
@belisarius Yes, but only in his specific case ;) –  Vitaliy Kaurov Jan 25 '13 at 19:42
    
@VitaliyKaurov Not now –  belisarius Jan 25 '13 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 '13 at 19:44
    
@stevenvh I put it back ;) –  Vitaliy Kaurov Jan 25 '13 at 19:45
add comment

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 '13 at 7:04
    
@Mr.Wizard, I find this happens quite a lot the other way round :-) –  Simon Woods Jan 26 '13 at 17:56
    
I now know who to contact if I want to work on project with someone. –  Mr.Wizard Jan 26 '13 at 18:01
add comment

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.