【问题标题】:Create a Function for Customized Tabular Representation为自定义表格表示创建函数
【发布时间】:2011-05-28 02:59:14
【问题描述】:

我使用下面的代码来概览我的部分数据。

  • 从以下代码中创建函数的最佳方法是什么?

  • 它将一个 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]}]
    

【问题讨论】:

  • 我编辑了你的代码,因为水平滑动条很糟糕
  • 我不会将以上描述为图形表示。这是一个表格表示...我觉得这个问题有点不清楚,你能试着改写一下吗?
  • @Sjoerd,希望现在更好
  • 最好也更正一下标题:在Mathematica 的意义上,这个问题与Graphics 无关。

标签: function grid wolfram-mathematica tabular


【解决方案1】:

贝利撒留给出了基本的方法。我将介绍一种高级方法,因为您似乎很想学习。

首先让我说,我看到了我认为是对您的代码的简化,并且我做了它们,希望没有错误。

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

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

目标

  1. 由于使用的主要函数是Grid,因此允许将选项传递给它是有意义的。

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

  3. 我希望Grid 不理解的自定义选项的可能性。


实施

目标 #1

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

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]

customTabular[data, Background -> LightBlue]

目标 #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]

目标 #3

现在我想添加一个传递给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}
]

【讨论】:

  • 非常好!展示设计过程,而不仅仅是结果。 +1
  • @Mr.Wizard 没什么好想的。如果您真的希望这是最大程度的教学(它已经是教学),您可以将参考/链接放在文档中,例如 OptionsPatternFilterRules,以及一些指向一些讨论选项机制的地方。
  • @d00b 谢谢!我正在向 Leonid 学习如何给出好的答案。
  • @Leonid,我注意到对于Grid,我使用Sequence @@ 是多余的。这更普遍吗? OptionsPattern[] 匹配列表内外的规则;假设大多数函数接受给定的选项是否安全,例如:f[1, 2, op1 -> val, op2 -> val, {op3 -> val, op4 -> val}]
  • @Mr.Wizard 不,这不安全(IMO​​)。问题是当你多次传递选项时,你可能会累积规则列表的深度。而且由于(嵌套)列表中的多个规则不会被解释为选项,因此您可能会遇到麻烦。在任何情况下,我都不会指望这一点——这对我来说并不是节省一些击键的好案例。只是我的两分钱......
【解决方案2】:

我会照常做

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]

我不确定你在最后一部分想要问什么such a graph as an output ...

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多