Создать функцию для настраиваемого табличного представления - PullRequest
6 голосов
/ 28 мая 2011

Я использую приведенный ниже код, чтобы получить обзор частей моих данных.

  • Как лучше всего сделать функцию из приведенного ниже кода?

  • Он будет принимать список данных, а также некоторые графические параметры (например, цвета) в качестве аргументов и возвращать настраиваемое табличное представление, как показано ниже.

    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 ]

7 голосов
/ 29 мая 2011

Велисарий дал основной метод. Я представлю продвинутый метод, потому что вы, кажется, хотите учиться.

Сначала позвольте мне сказать, что я увидел то, что, по моему мнению, было упрощением вашего кода, и я сделал их, надеюсь, не по ошибке.

Я буду использовать этот пример данных на иллюстрациях ниже:

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]

enter image description here

customTabular[data, Background -> LightBlue]

enter image description here

Цель № 2

Параметры, которые определяют ваш табличный формат, могут быть отделены от тела функции. Это позволит их удобно менять или ссылаться на них. Я начинаю с очистки предыдущего определения с ClearAll. Затем я устанавливаю значение по умолчанию Options для customTabular:

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

Теперь я хочу добавить параметр, который не передается 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}
]

enter image description here

4 голосов
/ 28 мая 2011

Я бы сделал это обычным способом

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 ...

...