Библиотека / инструмент для рисования троичных / треугольных графиков [закрыт]

StackOverflow https://stackoverflow.com/questions/701429

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Для создания троичных графиков с использованием видеомагнитофон, просто позвони тройной график() и передайте матрицу m x 3, то есть матрицу с тремя столбцами.

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

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

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

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

Другие советы

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

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()

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

Он основан на ggplot2 ( 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")

Веуш поддерживает троичные графики.Вот пример из Документация: Example plot

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

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

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

Похоже, что реализация уже работает здесь в gnuplot:ternary plot
(источник: ugm.ac.id)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top