我使用下面的代码概述了部分数据。
使用以下代码制作函数的最佳方法是什么?
将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]}]
答案 0 :(得分:7)
Belisarius给出了基本方法。我将介绍一种先进的方法,因为你似乎渴望学习。
首先让我说,我看到了我认为对您的代码进行了简化,并且我制作了它们,希望不会出错。
我将在下面的插图中使用此示例数据:
data = Prepend[
RandomInteger[99, {5, 12}],
DateString[{1, #}, "MonthName"] & /@ Range@12
];
由于使用的主要功能是Grid
,因此允许向其传递选项是有意义的。
您有一系列定义表格的选项。我希望能够方便地改变这些。
我希望Grid
无法理解自定义选项。
添加了参数模式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]
定义表格格式的选项可以与函数体分开。这将允许方便地更改或引用它们。我首先使用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]
现在我想添加一个 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}
]
答案 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]
我不确定你在最后一部分such a graph as an output
...