2009-03-31 5 views
14

мне нужно нарисовать ternary/triangle plots, представляющие собой мольные доли (х, у, Z) различных веществ/смесей (х + у + г = 1). Каждый график представляет собой изо-значные вещества, например. вещества, которые имеют одинаковую точку плавления. Графики должны быть нарисованы на том же треугольнике с разными цветами/символами, и было бы неплохо, если бы я мог также подключить точки.библиотека/инструмент для рисования тройные/треугольник участки

Я посмотрел на matplotlib, R и gnuplot, но они, похоже, не могут рисовать такой сюжет. Сторонний пакет ade4 для R, похоже, способен нарисовать его, но я не уверен, могу ли я рисовать несколько графиков на одном и том же треугольнике.

Мне нужно что-то, что работает под Linux или Windows. Я открыт для любых предложений, включая библиотеки для других языков, например. Perl, PHP, Ruby, C# и Java.

+0

Есть еще несколько вариантов R, чем перечисленные ниже; попробуйте 'library (sos); findFn ("{trernary plot}") ' –

+0

R-пакет, который я только что создал, делает то, что вам нужно (и больше), оно основано на ggplot, веб-сайт www.ggtern.com –

+0

@CristianCiupitu done –

ответ

7

R имеет внешний пакет под названием VCD, который должен делать то, что вы хотите.

Документация очень хорошая (122-страничное руководство распределено с упаковкой); есть также одноименная книга, Визуальный дисплей количественной информации, автор пакета (профессор Майкл Дружественный).

Чтобы создать тройные участки, используя VCD, просто вызовите ternaryplot() и передать в м х 3 матрицы, то есть матрицу с тремя колонками.

Подпись метода очень проста; требуется только один параметр (матрица данных m x 3); и все параметры ключевого слова относятся к эстетике сюжета, за исключением масштаба, который, когда установлен в 1, нормализует столбцы данных.

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

V(b, c/2, c * (3^.5)/2 

для того, чтобы генерировать диаграмму ниже, я только что создали некоторые поддельные данные, представляющие четырех различных химических смесей, каждая из которых состоит из различных фракций трех веществ (х, у, г). Я масштабировал ввод (так что x + y + z = 1), но функция сделает это для вас, если вы передадите значение для своего параметра «scale» (фактически, по умолчанию это 1, который, я считаю, является вашим вопросом требуется). Я использовал разные цвета & символов для представления четырех точек данных, но вы также можете просто использовать один цвет/символ и пометить каждую точку (через аргумент «id»).

http://www.freeimagehosting.net/uploads/35393eaba5.png

+0

Это определенно выглядит интересно, слишком плохо, что у него так много зависимостей, которых у меня нет на моей машине Fedora 12 :-(В любом случае спасибо за ответ и +1 от меня. –

+1

это очень плохо - я думаю, вам понравилось бы используя эту библиотеку в противном случае. (Совсем случайно, что, когда я печатал свой ответ выше, я сидел в аэропорту Бухареста на обратном пути в Испанию из альпинистской поездки в великолепных горах Фагарас.) Я не думаю, что у меня есть rep, чтобы добавить тэг 'r' к вашему Q, поэтому, если вы согласитесь, возможно, добавьте этот тег, когда у вас есть шанс. – doug

+0

Мне удалось установить его на Fedora 12, запустив R и набрав в командной строке R install.packages (c ("vcd")) '. Также примеры из справочной страницы' ternaryplot' работали как шарм. Еще раз спасибо! Что касается тега 'r', я не заметил вашего комментария, иначе я бы добавил его PS: Я рад, что вам понравилась ваша скалолазание. –

0

Найти векторную графическую библиотеку и нарисовать ее с нуля, если вы не можете найти более простой способ сделать это.

+0

Я тоже подумал об этом, но это будет слишком много (хрюкать). Есть много деталей, которые необходимо выяснить, например. расположение меток осей или отметки. Btw, решение Фила в основном рисует график с нуля. –

3

Chloë Льюис разработал общего класс треугольника сюжета, означал для поддержки Почвы треугольника с Python и Matplotlib. Она доступна здесь http://nature.berkeley.edu/~chlewis/Sourcecode.html https://github.com/chlewissoil/TernaryPlotPy

редактирования Хлоя добавить: Перемещенные его более надежным хозяином! Кроме того, это публичное репо, поэтому, если вы хотите запросить библиотеку, вы можете добавить проблему. Надеюсь, это кому-то полезно.

+0

Хорошие сюжеты и +1 Слишком плохо, что код не является достаточно общим для использования в качестве библиотеки. –

+0

ссылка отправляет 404 :( – oDDsKooL

+0

@chplewis: спасибо за ваше редактирование! –

13

Создал очень простой скрипт для создания трехмерных (или более) графиков. Нет линий сетки или выпадающих линий, но это не будет слишком сложно добавить с помощью векторов в «базовом» массиве.

enter image description here

from pylab import * 


def ternaryPlot(
      data, 

      # Scale data for ternary plot (i.e. a + b + c = 1) 
      scaling=True, 

      # Direction of first vertex. 
      start_angle=90, 

      # Orient labels perpendicular to vertices. 
      rotate_labels=True, 

      # Labels for vertices. 
      labels=('one','two','three'), 

      # Can accomodate more than 3 dimensions if desired. 
      sides=3, 

      # Offset for label from vertex (percent of distance from origin). 
      label_offset=0.10, 

      # Any matplotlib keyword args for plots. 
      edge_args={'color':'black','linewidth':2}, 

      # Any matplotlib keyword args for figures. 
      fig_args = {'figsize':(8,8),'facecolor':'white','edgecolor':'white'}, 
     ): 
    ''' 
    This will create a basic "ternary" plot (or quaternary, etc.) 
    ''' 
    basis = array(
        [ 
         [ 
          cos(2*_*pi/sides + start_angle*pi/180), 
          sin(2*_*pi/sides + start_angle*pi/180) 
         ] 
         for _ in range(sides) 
        ] 
       ) 

    # If data is Nxsides, newdata is Nx2. 
    if scaling: 
     # Scales data for you. 
     newdata = dot((data.T/data.sum(-1)).T,basis) 
    else: 
     # Assumes data already sums to 1. 
     newdata = dot(data,basis) 

    fig = figure(**fig_args) 
    ax = fig.add_subplot(111) 

    for i,l in enumerate(labels): 
     if i >= sides: 
      break 
     x = basis[i,0] 
     y = basis[i,1] 
     if rotate_labels: 
      angle = 180*arctan(y/x)/pi + 90 
      if angle > 90 and angle <= 270: 
       angle = mod(angle + 180,360) 
     else: 
      angle = 0 
     ax.text(
       x*(1 + label_offset), 
       y*(1 + label_offset), 
       l, 
       horizontalalignment='center', 
       verticalalignment='center', 
       rotation=angle 
      ) 

    # Clear normal matplotlib axes graphics. 
    ax.set_xticks(()) 
    ax.set_yticks(()) 
    ax.set_frame_on(False) 

    # Plot border 
    ax.plot(
     [basis[_,0] for _ in range(sides) + [0,]], 
     [basis[_,1] for _ in range(sides) + [0,]], 
     **edge_args 
    ) 

    return newdata,ax 


if __name__ == '__main__': 
    k = 0.5 
    s = 1000 

    data = vstack((
     array([k,0,0]) + rand(s,3), 
     array([0,k,0]) + rand(s,3), 
     array([0,0,k]) + rand(s,3) 
    )) 
    color = array([[1,0,0]]*s + [[0,1,0]]*s + [[0,0,1]]*s) 

    newdata,ax = ternaryPlot(data) 

    ax.scatter(
     newdata[:,0], 
     newdata[:,1], 
     s=2, 
     alpha=0.5, 
     color=color 
     ) 
    show() 
1

Я только что обнаружил инструмент, который использует Python/Matplotlib для создания тройных участков, называемых wxTernary. Он доступен через http://wxternary.sourceforge.net/ - с первой попытки я смог успешно создать трехмерный график.

+0

проект, похоже, не проверял скрипт в SCM :( – oDDsKooL

0

Существует пакет R с именем soiltexture. Он нацелен на график треугольника текстуры почвы, но может быть настроен для некоторых аспектов.

6

Пакет Я автор в R имеет только были приняты для CRAN, веб-страница www.ggtern.com:

Он базируется ggplot2, который я использовал в качестве платформа. Движущей силой для меня было желание иметь постоянство в моей работе, и, поскольку я сильно использую ggplot2, разработка пакета была логической прогрессией.

Для тех из вас, кто использует ggplot2, использование ggtern должно быть ветерок, и вот несколько демонстраций того, что можно достичь.

Feldspar

Производится с помощью следующего кода:

# Load data 
data(Feldspar) 

# Sort it by decreasing pressure 
# (so small grobs sit on top of large grobs 
Feldspar <- Feldspar[with(Feldspar, order(-P.Gpa)), ] 

# Build and Render the Plot 
ggtern(data = Feldspar, aes(x = An, y = Ab, z = Or)) + 
#the layer 
geom_point(aes(fill = T.C, 
       size = P.Gpa, 
       shape = Feldspar)) + 
#scales 
scale_shape_manual(values = c(21, 24)) + 
scale_size_continuous(range = c(2.5, 7.5)) + 
scale_fill_gradient(low = "green", high = "red") + 

#theme tweaks 
theme_tern_bw() + 
theme(legend.position  = c(0, 1), 
     legend.justification = c(0, 1), 
     legend.box.just  = "left") + 

#tweak guides 
guides(shape= guide_legend(order =1, 
          override.aes=list(size=5)), 
     size = guide_legend(order =2), 
     fill = guide_colourbar(order=3)) + 

#labels and title 
labs(size = "Pressure/GPa", 
    fill = "Temperature/C") + 
ggtitle("Feldspar - Elkins and Grove 1990") 

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

Contour

Произведено со следующим кодом:

ggtern(data=Feldspar,aes(An,Ab,Or)) + 
    geom_confidence(aes(group=Feldspar, 
         fill=..level.., 
         alpha=1-..level..), 
         n=2000, 
        breaks=c(0.01,0.02,0.03,0.04, 
          seq(0.05,0.95,by=0.1), 
          0.99,0.995,0.9995), 
        color=NA,linetype=1) + 
    geom_density2d(aes(color=..level..)) + 
    geom_point(fill="white",aes(shape=Feldspar),size=5) + 
    theme_tern_bw() + 
    theme_tern_nogrid() + 
    theme(ternary.options=element_ternary(padding=0.2), 
         legend.position=c(0,1), 
         legend.justification=c(0,1), 
         legend.box.just="left") + 
    labs(color="Density",fill="Confidence", 
    title="Feldspar - Elkins and Grove 1990 + Confidence Levels + Density") + 
    scale_color_gradient(low="gray",high="magenta") + 
    scale_fill_gradient2(low="red",mid="orange",high="green", 
         midpoint=0.8) + 
    scale_shape_manual(values=c(21,24)) + 
    guides(shape= guide_legend(order =1, 
          override.aes=list(size=5)), 
     size = guide_legend(order =2), 
     fill = guide_colourbar(order=3), 
     color= guide_colourbar(order=4), 
     alpha= "none") 
Смежные вопросы