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

python r plot gnuplot

11036 просмотра

9 ответа

15214 Репутация автора

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

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

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

Автор: Cristian Ciupitu Источник Размещён: 31.03.2009 03:02

Ответы (9)


0 плюса

11497 Репутация автора

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

Автор: CookieOfFortune Размещён: 31.03.2009 03:16

1 плюс

14959 Репутация автора

Там , как представляется , реализация на работе здесь в Gnuplot: (источник: ugm.ac.id )троичный участок

Автор: Phil H Размещён: 31.03.2009 03:18

7 плюса

55748 Репутация автора

Решение

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

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

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

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

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

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

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

Автор: doug Размещён: 10.01.2010 01:06

3 плюса

522 Репутация автора

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

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

Автор: Frédéric Grosshans Размещён: 11.01.2011 02:30

13 плюса

131 Репутация автора

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

введите описание изображения здесь

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()
Автор: dave Размещён: 20.05.2011 06:14

1 плюс

173 Репутация автора

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

Автор: Deaton Размещён: 13.10.2011 09:19

0 плюса

39 Репутация автора

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

Автор: Eric Размещён: 14.10.2011 12:09

4 плюса

1843 Репутация автора

Веуш поддерживает троичные участки. Вот пример из документации :Пример сюжета

Автор: xioxox Размещён: 16.07.2013 01:55

6 плюса

5287 Репутация автора

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

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

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

полевой шпат

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

# 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")

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

контур

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

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")
Автор: Nicholas Hamilton Размещён: 19.12.2013 01:22
Вопросы из категории :
32x32