четверг, 5 сентября 2013 г.

Matplotlib. Latex Font matching problems.

Сегодня я расскажу немного о проблемах применения сторонних для MatPlotlib шрифтов LaTeX2e. Один из таких шрифтов является lmodern. Но суть ограничивается не только им. Включение пакетов в преамбулу LaTeX, который используется для MatPlotlib достаточно тяжело, т.к. функция кривая, причем это заявляют и сами разработчики. Однако, так как мы с вами из того типа людей, которые постоянно гоняются за мелочами, то нам предстоит решить эту проблему.

Разработчиками MatPlotlib заложены следующие шрифты, которые гарантированно работают при компиляции графика. Список их следующий:
Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif

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

Разберем небольшой код:
import matplotlib.pyplot as plt
#LaTeX
plt.rcParams['text.latex.preamble']=[r"\usepackage{lmodern}"]
params = {'text.usetex' : True,
                 'font.size' : 11,
                 'font.family' : 'lmodern',
                 'text.latex.unicode': True,
                  }
plt.rcParams.update(params)

fig = plt.figure()
fig.set_size_inches(3.54,3.54)
plt.plot([1,2,3,4])
plt.xlabel("Excitation-Energy")
plt.ylabel("test")
plt.savefig("graph.pdf",
                  dpi=1000,
                  bbox_inches='tight',
                   )
В нем представлен простейший график
Сразу оговорюсь. Данный график представляет правильный вариант того, как это всё должно выглядеть.

Перейдем к LaTeX:
\documentclass[11pt]{scrartcl}
\usepackage[T1]{fontenc}\usepackage[utf8]{inputenc}\usepackage{lmodern}\usepackage{graphicx}
\begin{document}
\begin{figure} \begin{center} \includegraphics{./graph} \caption{Excitation-Energy} \label{fig:graph} \end{center}\end{figure}
\end{document}
В итоге получаем красивый конечный результат, где отсутствует разница в шрифтах.
 Вот их образцы, первый Ex это MatPlobLib, а второй это уже pdfLaTeX.


Как видим - результат достигнут.

Теперь перейдем к деталям и найдем то как мы это сделали.
Вообще, для совпадения шрифтов в двух pdf документах, приготовленных в LaTeX и в MatPlotlib необходимо соблюдать правила:

  • Размер изображения, которое вы вставляете в LaTeX должно совпадать с желаемым на печати и иметь необходимое количество dpi. Для графика это например 1000, для картинок и прочего значение может быть меньше, начиная с 200.
    Для этого необходимо поставить параметр в savefig('name',  dpi=1000)
    Размер строимой фигуры обычно задается при помощи команды
    fig.set_size_inches( a, b), где fig это созданная ранее фигура.
  • Помимо этого, график должен занимать полный размер вставляемого pdf документа, это сократит ненужные проблемы с пробелами при верстке документа.
    Для этого необходимо подавить лишние поля на графике. С этим параметром необходимо быть осторожным. Может порезать слишком большие шрифты подписи.
    В теже параметры вносим savefig('name', bbox_inches='tight')
  • Необходимо использовать одинаковое семейство шрифтов для графиков и для документа.
Если сообщать в rc параметр 'font.family' : 'lmodern' то на вид, шрифт получается толще чем надо. Однако, если хочешь таким же макаром включить шрифт в преамбулу LaTeX под MatPlotlib случается ошибка. Самая главная проблема в том, что эти два параметра должны выполняться вместе. Необходимо поставить семейство lmodern и в MatPlotlib и в LaTeX. Для этого в параметрах прописываем 'font.family' : 'lmodern', а потом напрямую вводим параметр использования пакета в преамбуле через 
plt.rcParams['text.latex.preamble']=[r"\usepackage{lmodern}"]

На этом всё, мы получаем финальный результат, как и описывалось ранее.

среда, 28 августа 2013 г.

Python. Matplotlib. 3d plot and cubic interpolation.

Сегодня я на наглядном примере покажу, как привести достаточно угловатый контурный график в надлежащий красивый вид методом кубической интерполяции. С данной проблемой я столкнулся, когда строил график по экспериментальным данным, которые обычно далеки от совершенства.  Основной проблемой в построении 3д графиков и контуров является понимание простой вещи - что такое 3д график. А 3д график это не что иное как составленные в ряд по одной оси (x или y) обычные двухмерные графики. Поэтому, проявив небольшую сноровку, можно легко начать пользоваться этим достаточно гибким инструментом визуализации. Обычно для графиков я не привык использовать кубическую интерполяцию. Для меня более правильным методом является аппроксимация, но так как задача стояла просто получить более красивый график из сырых данных я не стал сильно углубляться в этот раз.
Основным математическим аппаратом в среде Python для выполнения подобных действий является NumPy и SciPy. Данный пример написан предельно просто, стоит только пояснить, что данные X, Y, Z были получены при помощи стандартной функции, заложенной матплотлиб, но их можно задать как руками, так и другими способами. На данном примере можно поэкспериментировать со степенью "сырости" этих данных меняя параметр функции, как описано в комментарии. Для самой интерполяции данных мы как раз и будем использовать пакет SciPy. В данном примере показано, что вся интерполяция выполняется по сути одной строкой и функцией zoom и не представляет никакой сложности для понимания, а теперь перейдем непосредственно к коду и результату!


import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import zoom
from mpl_toolkits.mplot3d import axes3d
# Receive standard Matplotlib data for 3d plot
X, Y, Z = axes3d.get_test_data(1) # '1' is a step requested data
#Calculate smooth data
pw = 10 #power of the smooth
Xsm, Ysm, Zsm = map((lambda x: zoom(x, pw)), (X, Y, Z))
#or simply make:
#Xsm = zoom(X, pw)
#Ysm = zoom(Y, pw)
#Zsm = zoom(Z, pw)
# Create blank plot
fig = plt.figure()
#Create subplots
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
# Plotting
ax1.contour(X, Y, Z)
ax2.contour(Xsm, Ysm, Zsm)
plt.show()

пятница, 25 января 2013 г.

Решение проблемы с сетью в Ubuntu 12.10 и Asus P8H77-v

Для того чтобы пофиксить эту проблему вам понадобиться телефон, способный раздавать интернет через WiFi или найти другой способ подключить интернет на комп.
Потом сделать сдующие команды или просто найти через Synaptic пакет compat-wireless modules и поставить последнюю версию:

sudo apt-get install linux-backports-modules-cw-current
sudo modprobe alx

пятница, 28 декабря 2012 г.

Монтирование дисков Synalogy на Ubuntu 12.10 через fstab

При покупке Synalogy DS413j столкнулся с проблемой монтирования дисков. Решил её следующим образом.
Для начала необходимо настроить хранилище на поддержку NFS, потом необходимо поставить в разделе Папок общего доступа Права NFS на чтение и запись для всех пользователей. Без этого ничего не заработает, а также внизу этого окошка будет написан путь к данной папке, на которую далее необходимо будет ссылаться. Более подробный мануал можно найти здесь.

Файл fstab в моём случае выглядит так:
192.168.1.101:/volume2/music /media/elenium/Music nfs rsize=8192,wsize=8192,timeo=14,intr,users,auto
и т.д. для каждой папки, которую хочется расшарить. Для того чтобы подмонтировать все диски в случае если комп был включен, а хранище включили потом необходимо просто ввести:
sudo mount -a

среда, 2 ноября 2011 г.

Пишем диски под Xbox 360

Хочу сделать для себя небольшую заметку по поводу записи дисков на xbox 360 S 4gb с прошивкой привода Ixtreme LT+ 2.0. Сразу скажу, что в лайв играть не буду, поэтому про его безопасность тоже говорить не буду.

Игры для Xbox 360 можно скачать со всем известного ресурса http://thepiratebay.org/. Раздаются как образы iso, так и архивы, которые необходимо в эти самые образы собрать, ничего сложного.

Для начала нам понадобится привод, у меня он простейший внешний Lite-On eNAU608, потом диски DVD+R DL, обязательно +R и обязательно двухслойные. Диски желательно качественные, чтобы небыло проблем в вибрацией и разбалансировкой диска. В приставке всё очень компактно расположено, поэтому кулер матери может начать шкрябать корпус и плохо работать. Лично я использую Virbatim.

Теперь непосредственно запись, для которой я использую стандартный софт Ubuntu 11.10 под названием growisofs.

Если игра XG3 и не лезет на стандартный диск, надо просто обрезать образ следующим образом:
truncate --size=8547991552 /путь к исо файлу/файл.iso
Команда на запись диска выглядит следующим образом
growisofs -use-the-force-luke=dao -use-the-force-luke=break:1913760 -dvd-compat -speed=2 -Z /dev/dvdrw1=/путь к исо файлу/файл.iso
Если игра XG3, то записывать надо следующим образом, предварительно обрезав образ:
growisofs -use-the-force-luke=break:2133520 -speed=4 -Z /dev/dvdrw1=/путь к файру/имя файла.iso  
Теперь немного объясню, что это белиберда значит.
Команда  -use-the-force-luke=dao -use-the-force-luke=break:1913760 созжаёт ручной переход с первого слоя диска на сторой, причем в определённом месте 1913760, иначе Xbox 360 не захочет читать этот диск.  Команда -dvd-compat -speed=2 говорит какую задать скорость привода. Я пишу на медленной скорости "на всякий пожарный", да и диски будут лучше читаться. Команда /dev/dvdrw1= указывает через какой привод прожечь исо файл. В моём случае это привод dvdrw1.

Вот пожалуй и всё, можно добавить всякие извращения типо booktype, но я считаю это ненужным, т.к. у меня и так всё работает.

четверг, 5 мая 2011 г.

Смена аудиокарты при помощи Unity

Не всем будет полезно это знать, но тем кому это необходимо будут радоваться! Сегодня я научу Вас, как менять выход с одной аудиокарты на другую одной кнопкой, причем под новой Ubuntu 11.04 с использованием Unity.

Для начала надо прикинуть как меняется звук в самом гноме. Меняется он при помощи PulseAudio, Кому интересно могут порыться полностью, но я затрону только часть. Почитав TFM я увидел, что в самом низу страницы есть скриптик, который подходит под наши нужды. 
Слегонца испохабив и урезав комментарии для блога я получил следующее:
#!/bin/bash
totalsc=$(pacmd "list-sinks" | grep card: | wc -l)
if [ $totalsc -le 1 ]; then
  notify-send -u critical -t 5000 "Nothing to switch, system only has one sound card."
  exit
fi
scindex=$(pacmd list-sinks | awk '$1 == "*" && $2 == "index:" {print $3}')
cards=$(pacmd list-sinks | sed 's|*||' | awk '$1 == "index:" {print $2}')
PICKNEXTCARD=1
count=0
for CARD in $cards; do
  if [ $PICKNEXTCARD == 1 ]; then
    nextsc=$CARD
    PICKNEXTCARD=0
    nextind=$count
  fi
  if [ $CARD == $scindex ]; then
    PICKNEXTCARD=1
  fi
  count=$((count+1))
done
pacmd "set-default-sink $nextsc"
inputs=$(pacmd list-sink-inputs | awk '$1 == "index:" {print $2}')
for INPUT in $inputs; do # Move all current inputs to the new default sound card
  pacmd move-sink-input $INPUT $nextsc
done
nextscdesc=$(pacmd list-sinks | awk '$1 == "device.description" {print substr($0,5+length($1 $2))}' \
                         | sed 's|"||g' | awk -F"," 'NR==v1{print$0}' v1=$((nextind+1)))
exit
Всё что нам надо, это сохранить этот скрипт в файл и положить его в необходимую папку. Назовем файл soundswitch и наполним его сосуд истиной кода. После чего выполняем копирование:
sudo cp soundswitch /usr/local/bin/
Дальше создаём ярлык для запуска скрипта. Лично я сделал это ручками, создав файлик, наполнив его следующим содержимым:
[Desktop Entry]
Name=Soundswitch
Exec=/usr/local/bin/soundswitch
Icon=preferences-sound
Terminal=false
Type=Application
StartupNotify=false
Дальше следует просто перетянуть этот ярлык на панель Unity и получать удовольствие от клика и перманентной смены аудиокарты. 
PS: Возникла проблемка с быстрой сменой в Unity. При нажатии на кнопку она сменяет аудиокарту, но потом долго тупит и только потом можно нажать снова. Пока не нашел как победить эту напасть.

воскресенье, 1 мая 2011 г.

LaTeX, Tabular и костыли...

Сегодня я покажу как решить ещё одну проблему с tabular. У всех наверное возникало желание сделать таблицу со столбцами необходимого размера. Обычно это делается вводной строкой по виду:

\begin{tabular}{|p{0.15\textheight}|p{0.2\textheight}|p{0.2\textheight}|}\hline
Я хочу быть в центре & $1$ & $м^2$  \\
Я тоже хочу быть в центре & $2$ & $см^2$ \\
А я буду в центре & $3$ & $дм^2$ \\\hline
\end{tabular}

 И получаем мы что-то типо:
Но как быть, если мне надо, чтобы цифры из второго столбца были в центре? Ну и вообще, если я хочу сделать более красиво?

Нам понадобиться пакет \usepackage{array}. Почитав к нему документацию я нарыл полезных вещей. Начнемс.
При импорте пакета у нас появляется возможность использовать структуру:
>{decl.} и <{post decl.}
Первая команда помогает нам декларировать прямо перед надписью в строке, а вторая соответственно после, любой текст и команды. Теперь на живом примере покажу как и что можно сделать.
Исправляем код, на вот такой:

\begin{tabular}{|p{0.15\textheight}|>{$}p{0.2\textheight}<{$}|>{$}p{0.2\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\
Я тоже хочу быть в центре & 2 & см^2 \\
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular}

Компилируем и видим, что ничего не изменилось. Однако, LaTeX не вывалил ошибки по поводу того, что у нас стоит ^2 без соответствующих $...$. Теперь рассмотрим почему. Как говорилось ранее, команды >{decl.} и <{post decl.} добавляют чепуху в нашей строке. В нашем случае происходит добавление необходимых знаков $...$ до и после командами:
>{$} и <{$}
Мы избавились от ненужного копипаста, дальше больше, непосредственное центрование. Кто знает чутка как ковырять LaTeX, уже знает команду \centering. Так как у нас создаётся в каждой ячейке таблицы \parbox{width}{}, то внутри него можно объявлять команду \centering и мы не получим никаких лишних сюрпризов. Но не будем же мы каждый раз писать в каждой ячейке эту команду? Правильно, добавляем её подобным макаром, но с одним небольшим НО:

\begin{tabular}{|p{0.15\textheight}|>{\centering\arraybackslash$}p{0.2\textheight}<{$}|>{$}p{0.2\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\
Я тоже хочу быть в центре & 2 & см^2 \\
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular}

На выходе получаем следующее:
Теперь о этом самом НО. Если не написать после \centering \arraybackslash, то в случае таблицы у нас будут матюки и вся программа вывалиться. \arraybackslash означает что-то типо \\, но вдаваться в подробности не буду, если надо, то почитаете сами.

А теперь чертовски хитрый ход конём. Чтобы не писать каждый раз эту длинную фразу к каждому столбцу умные люди придумали следующее:
\newcolumntype{X}[1]{>{\centering\arraybackslash}p{#1}} 
Да, да, это функция, но только специфическая. Она создаёт новый тип колонки, который вызывается через X{width}, и делает колонку по центру. Соответственно можно модифицировать как хочется.
Ну а теперь полный мастеркласс:
\usepackage{array}
\newcolumntype{X}[1]{>{\centering\arraybackslash}p{#1}}
\usepackage{rotating} 
\begin{tabular}{|X{0.1\textheight}@{\hspace{0.1\textheight}--->}>{\begin{sideways}$}X{0.1\textheight}<{$\end{sideways}}||>{$}X{0.1\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\ \cline{3-3}
Я тоже хочу быть в центре & 2 & см^2 \\ \cline{3-3}
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular} 

На выходе получаем следующее:

Помимо сказанного я применил фишку с добавлением отступа и разделителя командой
@{\hspace{0.1\textheight}--->}
Заметим, что цифры повернулись слево, это делается командой \begin{sideways}...\end{sideways} из пакета \usepackage{rotating}, которую мы тоже забабахали в объявление таблицы.

+ ко всему прочему, я заюзал команду \cline, о которой не знает только ленивый.
На этом пожалуй всё, удачи Вам в ваших LaTeX'ованиях!