Как применить AccountingForm для TableView, не затрагивая метки строк / столбцов? - PullRequest
3 голосов
/ 22 декабря 2011

Я использую M 8.0.4.

Я использую TableView в демо-манипуляции [] для отображения данных окончательного решения, представляющих собой матрицу числовых данных.

TableView очень удобен в использовании, поскольку он поставляется с автоматическими полосами прокрутки для перемещения вниз по строкам и вправо по столбцам, чтобы можно было видеть всю матрицу, сохраняя при этом общую область отображения фиксированной. (У меня есть изображение внизу)

Проблема, для которой я не могу найти решение, заключается в том, что мне нужно отформатировать матричные данные, чтобы они выглядели хорошо. В противном случае, если элемент данных слишком велик для размещения в ячейке, он будет перенесен, что приведет к смещению TableView. Мне также нужно отрегулировать десятичную точку в таком другом формате.

Я не могу применить NumberForm или AccountForm к данным, а затем применить TableView к результату, потому что TableView не любит видеть эти оболочки, ему нужны числа.

Но если применить AccountingForm к TableView, то числа, представляющие номера строк и номера столбцов, которые автоматически добавляются TableView, также форматируются. И я не хочу, чтобы те отформатировали также. Номер строки должен оставаться целым числом, а не с плавающей точкой. Я просто хочу, чтобы данные были отформатированы.

Я не мог понять, как отформатировать данные из таблицы. Когда я использую FullForm, чтобы увидеть, как данные хранятся в TableView, я не мог понять, как отформатировать их, не нарушая TableView.

Я покажу проблему, затем покажу, что я пытался.

(* make up some data, and make a TableView of it *)
data = {{-1234.8, 0.123}, {0.12345678, 0.1234}}
tbl = TableView[data, ItemSize -> {{3, {8}}}, DefaultBaseStyle -> 11, 
  Spacings -> {.2, .1}, FrameStyle -> Gray]

enter image description here

Обратите внимание, что номера строк и столбцов (отмечены) являются положительными целыми числами.

Теперь я хотел отформатировать сами данные (точные параметры форматирования, используемые ниже, являются только примером)

AccountingForm[tbl, {6, 3}, NumberSigns -> {"-", "+"}, 
 NumberPadding -> {"", ""}, SignPadding -> True]

Но теперь строки и столбцы таблицы также отформатированы:

enter image description here

Полная форма TableView:

In[156]:= FullForm[tbl]
TableView[List[List[-1234.8`,0.123`],List[0.12345678`,0.1234`]],
          Rule[ItemSize,List[List[3,List[8]]]],
          Rule[DefaultBaseStyle,11],Rule[Spacings,List[0.2`,0.1`]],
          Rule[FrameStyle,GrayLevel[0.5`]]]

Таким образом, данные в TableView можно извлечь, используя

In[166]:= tbl[[1]]
Out[166]= {{-1234.8,0.123},{0.12345678,0.1234}}

Но когда я изменяю tbl[[1]], используя ReplacePart[], с AccountingForm версией данных, TableView больше не работает:

formattedData = 
 AccountingForm[data, {6, 3}, NumberSigns -> {"-", "+"}, 
  NumberPadding -> {"", "0"}, SignPadding -> True];

In[245]:= tbl=ReplacePart[tbl,1->formatted]
Out[245]= TableView[{{-1234.8,+0.123},{+0.123,+0.123}},
          ItemSize->{{3,{8}}},DefaultBaseStyle->11,Spacings->{0.2,0.1},
          FrameStyle->GrayLevel[0.5]]

Итак, я сломал TableView. Так как он больше не отображается.

Вопрос: Как отформатировать числовые данные, которые входят в TableView, не влияя на значения индекса строки / столбца?

Кстати, вот так выглядит TableView внутри одной демонстрации Manipulate, которую я имею. Обратите внимание на автоматические полосы прокрутки. (В этом я не использую NumberForm и его друзей для форматирования. Но то, что я сделал, не очень эффективно, я бы предпочел использовать NumberForm, если смогу, поэтому мой вопрос)

enter image description here

спасибо

обновление 22.12.11 1:30 AM

Вот полный пример кода для Майка, который следит за своим ответом ниже

data = {{-1234.8, 0.123}, {0.12345678, 0.1234}};

newData = 
  Map[AccountingForm[#, {6, 3}, NumberSigns -> {"-", "+"}, 
     NumberPadding -> {"", ""}, SignPadding -> True] &, data, {2}];

tbl = TableView[newData, ItemSize -> {{3, {8}}}, Spacings -> {.2, .1},
   FrameStyle -> Gray]

Теперь, как именно я могу использовать команду Cell для вышеперечисленного? (Это в Manipulate, а не в сеансе записной книжки. Manipulate запускает все в одной ячейке. Я не могу создать отдельные ячейки и тому подобное в этом коде. Но попробовать это можно в новой записной книжке, но на самом деле код, который будет использовать это решение должно работать в манипуляторе без ячеек.

Обновление 12/22/11 5 утра

Я заметил некоторые не очень хорошие показатели TableView. Считайте этот код

Remove["Global`*"];
ClearSystemCache[]
m1 = MemoryInUse[$FrontEnd];
N[m1/10^6]
n = 256;
data = Table[RandomReal[], {n}, {n}];
TableView[data, ContentSize -> {300, 300}]
m2 = MemoryInUse[$FrontEnd] - m1;
N[m2/10^6]

Сами данные, считая удвоение для действительных значений, составляют только половину МБ. ByteCount говорит 2 МБ из-за другой структуры бухгалтерских данных.

In[114]:= ByteCount[data]/10^6//N
Out[114]= 2.10948

Но внешний интерфейс, похоже, использует гораздо больше оперативной памяти (для всего TableView я имею в виду не только данные), иногда я получаю 20 МБ, а иногда и намного больше (получая 100 МБ за один раз). Но если вы попробуете описанное выше на своем компьютере, вы заметите, что М испытывает трудности с этим. Я думаю, что это может быть отрисовка части таблицы, из-за которой M занимает так много времени.

Я не думаю, что 256 на 256 - это такая большая матрица. Даже при 128 на 128 было трудно представить его на экране. Как только он работает, он работает быстро и без проблем.

Похоже, TableView еще не очень хорошо оптимизирован. Я думаю, что я буду использовать его только для отображения небольшой части матрицы решения, так как производительность не очень хороша, чтобы использовать ее в демонстрации для отображения всего решения, из-за этого демонстрация будет выглядеть плохо.

Проблема в том, что матрица моего решения может быть большой, и я хотел, чтобы данные отображались в ограниченном объеме графического интерфейса. TableView - это все, что я могу найти со встроенной панелью прокрутки. Ничто другое в элементах управления Manipulate не может использовать что-то подобное, поэтому я должен использовать TableView.

Обновление 22.12.11 16:00

Спасибо за подсказку Майка ниже, теперь я смотрю на использование Pane с Scollbars, и оно работает лучше, чем TableView. (все еще немного медленный с большими данными, но не так плохо, как TableView)

Вот пример кода:

n = 32;
data = Table[RandomReal[], {n}, {n}];
grid = Grid[data, Spacings -> {.4, .4}, Alignment -> Left, Frame -> All];
grid = Style[NumberForm[grid, {6, 5}], LineBreakWithin -> False];
pane = Pane[grid, ImageSize -> {200}, Scrollbars -> True]

enter image description here

Единственная проблема, которую я заметил до сих пор, заключается в том, что когда n становится большим, Pane генерирует этот внешний кадр, говоря, что генерируется очень большой вывод. Но я уверен, что есть программный способ (вариант где-то) отключить этот эффект, я только начал смотреть на это и должен быть в состоянии найти способ обойти это, как только я выпью кофе. (скрестив пальцы)

enter image description here

хорошие новости

«Очень большой вывод был сгенерирован», ТОЛЬКО отображается в интерфейсе ноутбука. Когда я поместил код в Manipulate и запустил его, он не показал этот выходной кадр. Итак, я счастлив сейчас, и этот вопрос закрыт. Теперь я буду использовать Pane. (Еще раз спасибо Майку)

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

http://forums.wolfram.com/mathgroup/archive/2009/Apr/msg00935.html

но мне не нужно было ничего делать для того, что я делаю.

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

Я полагаю, что это достаточно другой метод для публикации в качестве другого ответа, хотя он явно заимствует из ответа Майка.

f = ToString @ 
    AccountingForm[#, {6, 3}, NumberSigns -> {"-", "+"}, 
     NumberPadding -> {"", ""}, SignPadding -> True] &;

data = {{-1234.8, 0.123}, {0.12345678, 0.1234}};

TableView[Map[f, data, {2}], ItemSize -> {{3, {8}}}, 
  DefaultBaseStyle -> 11, Spacings -> {.2, .1}, FrameStyle -> Gray]

Mathematica graphics



Так какиспользование ToString было не интуитивно понятно, я решил изучить его немного подробнее.Кажется, что TableView подавляет кавычки в строках, но только в пустых строках.Например:

string = "\"\"\"test\"";

TableView[{{ string }}]

Mathematica graphics

TableView[{{ {string} }}]

Mathematica graphics

Другое интересное поведение можно увидеть с 2D-форматированными строками:

string = "\!\(\*SuperscriptBox[SqrtBox[\"5\"], \"2\"]\)";

TableView[{{ string }}]

Mathematica graphics

TableView[{{ {string} }}]

Mathematica graphics

3 голосов
/ 22 декабря 2011

Одно предложение:

Сначала сделайте каждый элемент в ваших данных в AccountingForm, или любую другую форму, которую вы хотите:

f = AccountingForm[#, {6, 3}, NumberSigns -> {"-", "+"}, 
   NumberPadding -> {"", ""}, SignPadding -> True] &

newdata = {f[#[[1]]], f[#[[2]]]} & /@ data

Обратите внимание, что у меня немного мозгаисчезают, делая это.Я уверен, что есть более простой способ, чем Mapping (Правка: затухание мозга заставило меня забыть про уровни).Это даст вам вывод, подобный следующему:

enter image description here

Проблема, конечно, в том, что теперь у вас отображаются строковые символы, и «обычные» попытки отключить это не удаются («обычный» == инспектор опций, Style[] и т. д.).Но вы можете исправить это, изменив два стиля, которые существуют в таблице стилей Core.nb.Поэтому вам нужно будет отредактировать закрытые стили в текущей записной книжке, а также удалить DefaultBaseStyle из своего кода, поскольку это вызовет конфликт со стилем таблиц стилей.Итак, Формат> Редактировать таблицу стилей и добавьте этот стиль:

Cell[StyleData["TableViewItemExpression"],
 ShowStringCharacters->False,
 TemplateBoxOptions->{DisplayFunction->(StyleBox[#, Deployed -> False]& )}]

На самом деле это все, что вам нужно сделать, но если вы впоследствии захотите сделать некоторые дополнительные стили чисел, тогда вам нужноизменить другой стиль.Вот пример, делающий цифры красными:

Cell[StyleData["TableViewGrid"],
 ContextMenu->FEPrivate`FrontEndResource["ContextMenus", "TableView"],
 ShowAutoStyles->False,
 AutoSpacing->False,
 ShowStringCharacters->False,
 AutoNumberFormatting->True,
 LineIndent->0,
 FontWeight->"Plain",
 FontColor->RGBColor[1, 0, 0]]

И вот как это выглядит:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...