为自定义表格表示创建一个函数

时间:2011-05-28 02:59:14

标签: function grid wolfram-mathematica tabular

我使用下面的代码概述了部分数据。

  • 使用以下代码制作函数的最佳方法是什么?

  • 将dataList和一些图形选项(如颜色)作为参数,并返回自定义的表格表示,如下所示。

    overviewtheData=Text@Grid[{Map[Rotate[Text[#],
    90Degree]&,data[[1]]]}~Join~data[[2;;]],
    Background->{{{{White,Pink}},{1->White}}},
    Dividers->{All,{1->True,2->True,0->True}},
    ItemSize->{1->5,Automatic},
    Alignment->Top,
    Frame->True,
    FrameStyle->Thickness[2],
    ItemStyle->{Automatic,Automatic,{{1,1},
    {1,Length@data[[1]]}}->Directive[FontSize->15,Black,Bold]}]
    

enter image description here

2 个答案:

答案 0 :(得分:7)

Belisarius给出了基本方法。我将介绍一种先进的方法,因为你似乎渴望学习。

首先让我说,我看到了我认为对您的代码进行了简化,并且我制作了它们,希望不会出错。

我将在下面的插图中使用此示例数据:

data = Prepend[
         RandomInteger[99, {5, 12}], 
         DateString[{1, #}, "MonthName"] & /@ Range@12
       ];

目标

  1. 由于使用的主要功能是Grid,因此允许向其传递选项是有意义的。

  2. 您有一系列定义表格的选项。我希望能够方便地改变这些。

  3. 我希望Grid无法理解自定义选项。


  4. 实施

    目标#1

    添加了参数模式opts:OptionsPattern[],它匹配Option -> Setting个参数的任何序列,并将其命名为opts。 (有关详细信息,请参阅:OptionsPattern。)然后,optsGrid的其他选项之前插入基本函数。这允许任何明确给定的选项覆盖默认值,或者给出新的选项。

    customTabular[data_, opts : OptionsPattern[]] :=
      Grid[MapAt[Rotate[#, 90 Degree] & /@ # &, data, 1],
       opts,
       Background -> {{{White, Pink}}},
       Dividers -> {All, {2 -> True}},
       ItemSize -> {1 -> 5},
       Alignment -> {Center, {1 -> Top}},
       Frame -> True,
       FrameStyle -> Thickness[2],
       ItemStyle -> Directive[FontSize -> 15, Black, Bold]
      ] // Text
    

    示例:

    customTabular[data]
    

    enter image description here

    customTabular[data, Background -> LightBlue]
    

    enter image description here

    目标#2

    定义表格格式的选项可以与函数体分开。这将允许方便地更改或引用它们。我首先使用ClearAll清除先前的定义。然后我为customTabular设置了默认Options

    ClearAll[customTabular]
    
    Options[customTabular] =
      {Background -> {{{White, Pink}}},
       Dividers -> {All, {2 -> True}},
       ItemSize -> {1 -> 5},
       Alignment -> {Center, {1 -> Top}},
       Frame -> True,
       FrameStyle -> Thickness[2],
       ItemStyle -> Directive[FontSize -> 15, Black, Bold]};
    

    现在功能正常。这里Options@customTabular获得上面给出的规则。

    customTabular[data_, opts : OptionsPattern[]] := 
     Grid[MapAt[Rotate[#, 90 Degree] & /@ # &, data, 1],
       opts, 
       Sequence @@ Options@customTabular
     ] // Text
    

    现在,您可以使用SetOptions轻松更改默认值。例如:

    SetOptions[customTabular, 
      Background -> {{{LightMagenta, LightOrange}}}
    ];
    
    customTabular[data]
    

    enter image description here

    目标#3

    现在我想添加一个 not 传递给Grid的选项。我选择"Rotation"来更改标题行的文本轮换。

    我再次清除先前的定义和默认选项。请注意列表中包含"Rotation" -> 90 Degree

    ClearAll[customTabular]
    
    Options[customTabular] =
      {Background -> {{{White, Pink}}},
       Dividers -> {All, {2 -> True}},
       ItemSize -> {1 -> 5},
       Alignment -> {Center, {1 -> Top}},
       Frame -> True,
       FrameStyle -> Thickness[2],
       ItemStyle -> Directive[FontSize -> 15, Black, Bold],
       "Rotation" -> 90 Degree};
    

    现在我需要一种方法来使用这个新选项,我需要一种方法来阻止将此选项发送到Grid

    • 我使用OptionValue访问该选项,如果没有明确指定,则会提供默认选项。

    • 我只使用FilterRules传递了有效的Grid个选项。

    我首先将任何显式选项加入Options@customTabular列表的前面,再次覆盖默认值。

    customTabular[data_, opts : OptionsPattern[]] :=
     Grid[MapAt[Rotate[#, OptionValue["Rotation"]] & /@ # &, data, 1],
       Sequence @@ FilterRules[{opts} ~Join~ Options@customTabular, Options@Grid]
     ] // Text
    

    示例:

    SetOptions[customTabular, Background -> {{{LightBrown, LightYellow}}}];
    
    customTabular[data,
      Dividers -> All,
      "Rotation" -> -90 Degree,
      FrameStyle -> {Darker@Red, Thick}
    ]
    

    enter image description here

答案 1 :(得分:4)

我会按照通常的方式做到这一点

f[data_, color1_, color2_] := 
 Text@Grid[{Map[Rotate[Text[#], 90 Degree] &, data[[1]]]}~Join~
    data[[2 ;;]], Background -> {{{{color1, color2}}, {1 -> color1}}},
    Dividers -> {All, {1 -> True, 2 -> True, 0 -> True}},
    ItemSize -> {1 -> 5, Automatic}, Alignment -> Top, Frame -> True, 
    FrameStyle -> Thickness[2], 
    ItemStyle -> {Automatic, Automatic, {{1, 1}, {1, Length@data[[1]]}} -> 
                               Directive[FontSize -> 15, Black, Bold]}]

f[{{t1, t2, t3}, {1, 2, 3}, {4, 5, 6}}, LightBlue, Orange]

enter image description here

我不确定你在最后一部分such a graph as an output ...

中要求的内容