6

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

  • 从下面的代码中制作函数的最佳方法是什么?

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

在此处输入图像描述

4

2 回答 2

7

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

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

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

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。然后我将默认设置OptionscustomTabular

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如果没有明确给出,我访问将给出默认值的选项。

  • 我通过Grid使用仅传递有效选项FilterRules

我首先将任何显式选项加入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}
]

在此处输入图像描述

于 2011-05-28T20:08:19.487 回答
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]

在此处输入图像描述

我不确定您在最后一部分中要要求什么such a graph as an output...

于 2011-05-28T04:49:54.707 回答