Python 如何使三元绘图看起来像倒三角形?

Python 如何使三元绘图看起来像倒三角形?,python,plot,plotly,ternary,Python,Plot,Plotly,Ternary,我试图得到一个三元图来理解某些化合物形状的多样性。当使用plotly绘制球形、棒状和圆盘状时,它给出了一个很好的三角图,显示了所有化合物的多样性。但传统上,分子的PMI图绘制为倒三角形。谁能告诉我如何反转三角形图,这是我在执行以下命令后得到的。谢谢 df.头(5) 将numpy作为np导入 作为pd进口熊猫 将matplotlib.pyplot作为plt导入 导入plotly.graph_对象作为go def makeAxis(标题,tickangle=0,tickprefix='',ticks

我试图得到一个三元图来理解某些化合物形状的多样性。当使用plotly绘制球形、棒状和圆盘状时,它给出了一个很好的三角图,显示了所有化合物的多样性。但传统上,分子的PMI图绘制为倒三角形。谁能告诉我如何反转三角形图,这是我在执行以下命令后得到的。谢谢

df.头(5)

将numpy作为np导入
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
导入plotly.graph_对象作为go
def makeAxis(标题,tickangle=0,tickprefix='',ticksuffix='',tickformat='':
''一体式轴定制器''
返回{
“标题”:标题,
'titlefont':{'size':20},
“滴答声”:滴答声,
'tickfont':{'size':15},
“tickcolor”:“rgba(0,0,0,0)”,
“tickformat”:tickformat,
“showticklabels”:正确,
'showtickprefix':'all',
“tickprefix”:tickprefix,
'showticksuffix':'all',
“ticksuffix”:ticksuffix,
“痒”:5,
“showline”:正确,
“showgrid”:真
}
#从ASCII字符串构造数据帧
pmi_text=[“微笑npr1 npr2球体_相似杆_相似圆盘_相似”,
“0 ClCC(Cl)(Cl)Cl 0.541834 0.936058 0.477893 0.127884 3.942238e-01”,
“1 CC(Cl)(Cl)Cl 0.718463 0.718463 0.436926 0.563074 1.141665e-07”,
“2 ClC(Cl)C(Cl)Cl 0.519768 0.841920 0.361688 0.316160 3.221519e-01”,
“3 ClCC(Cl)Cl 0.498890 0.694875 0.193765 0.610249 1.959857e-01”,
“4 FC(F)(Cl)C(F)(Cl)Cl 0.720879 0.944308 0.665187 0.111383 2.234296e-01”]
t_smiles,t_npr1,t_npr2='smiles','npr1','npr2'
data_raw=dict(zip(pmi_text[0][4:.split(),np.array([r[4:.split(),用于pmi_text[1:]).T中的r))
数据_pmi={k:(如果k==t_.asfarray(v)),用于数据_raw.items()中的k,v
df=pd.DataFrame(data=data\u pmi)
mat_customdata=np.stack((df[t_npr1],df[t_npr2]),轴=-1)
显示(df)
t_A,t_B,t_C,t_后缀='rod','disc','sphere','u-likess'
轨迹名称、图形标题=‘PMI’、‘主惯性矩’
fig=go.Figure(go.散射三元(
name=trace\u name,
text=df[t_微笑],
a=df[f'{t_a}{t_后缀}'],
b=df[f'{t_b}{t_后缀}'],
c=df[f'{t_c}{t_后缀}'],
customdata=mat_customdata,
hoverlabel_align='right',
hovertemplate=“”.join(['%{text}:

', t_A+':%{A:.6f}
', t_B+':%{B:.6f}
', t_C+':%{C:.6f}

', t_npr1+':%{customdata[0]:g}
', t_npr2+':%{customdata[1]:g}', '']), mode='markers', 标记={'size':12} )) 图1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1({ “标题”:图_标题, “三元”: { "和":1,, “aaxis”:makeAxis(t_A.upper()+”,#“.”是为了对齐 tickprefix='r=', tickformat='.2f'), “baxis”:makeAxis(t_B.upper()+”, 滴答声角度=60, tickprefix='d=', tickformat='.2f'), 'caxis':makeAxis('.'+t_C.upper(), 滴答声角度=-60, tickprefix='s=', tickformat='.2f'), }, “showlegend”:错误 }) 图2(图3)
将numpy作为np导入
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
导入plotly.graph_对象作为go
def makeAxis(标题,tickangle=0,tickprefix='',ticksuffix='',tickformat='':
''一体式轴定制器''
返回{
“标题”:标题,
'titlefont':{'size':20},
“滴答声”:滴答声,
'tickfont':{'size':15},
“tickcolor”:“rgba(0,0,0,0)”,
“tickformat”:tickformat,
“showticklabels”:正确,
'showtickprefix':'all',
“tickprefix”:tickprefix,
'showticksuffix':'all',
“ticksuffix”:ticksuffix,
“痒”:5,
“showline”:正确,
“showgrid”:真
}
#从ASCII字符串构造数据帧
pmi_text=[“微笑npr1 npr2球体_相似杆_相似圆盘_相似”,
“0 ClCC(Cl)(Cl)Cl 0.541834 0.936058 0.477893 0.127884 3.942238e-01”,
“1 CC(Cl)(Cl)Cl 0.718463 0.718463 0.436926 0.563074 1.141665e-07”,
“2 ClC(Cl)C(Cl)Cl 0.519768 0.841920 0.361688 0.316160 3.221519e-01”,
“3 ClCC(Cl)Cl 0.498890 0.694875 0.193765 0.610249 1.959857e-01”,
“4 FC(F)(Cl)C(F)(Cl)Cl 0.720879 0.944308 0.665187 0.111383 2.234296e-01”]
t_smiles,t_npr1,t_npr2='smiles','npr1','npr2'
data_raw=dict(zip(pmi_text[0][4:.split(),np.array([r[4:.split(),用于pmi_text[1:]).T中的r))
数据_pmi={k:(如果k==t_.asfarray(v)),用于数据_raw.items()中的k,v
df=pd.DataFrame(data=data\u pmi)
mat_customdata=np.stack((df[t_npr1],df[t_npr2]),轴=-1)
显示(df)
t_A,t_B,t_C,t_后缀='rod','disc','sphere','u-likess'
轨迹名称、图形标题=‘PMI’、‘主惯性矩’
fig=go.Figure(go.散射三元(
name=trace\u name,
text=df[t_微笑],
a=df[f'{t_a}{t_后缀}'],
b=df[f'{t_b}{t_后缀}'],
c=df[f'{t_c}{t_后缀}'],
customdata=mat_customdata,
hoverlabel_align='right',
hovertemplate=“”.join(['%{text}:

', t_A+':%{A:.6f}
', t_B+':%{B:.6f}
', t_C+':%{C:.6f}

', t_npr1+':%{customdata[0]:g}
', t_npr2+':%{customdata[1]:g}', '']),
    smiles  npr1    npr2    sphere_likeness     rod_likeness    disc_likeness
0   ClCC(Cl)(Cl)Cl  0.541834    0.936058    0.477893    0.127884    3.942238e-01
1   CC(Cl)(Cl)Cl    0.718463    0.718463    0.436926    0.563074    1.141665e-07
2   ClC(Cl)C(Cl)Cl  0.519768    0.841920    0.361688    0.316160    3.221519e-01
3   ClCC(Cl)Cl  0.498890    0.694875    0.193765    0.610249    1.959857e-01
4   FC(F)(Cl)C(F)(Cl)Cl     0.720879    0.944308    0.665187    0.111383    2.234296e-01

import plotly.express as px

fig = px.scatter_ternary(df, a="sphere_likeness", b="rod_likeness", c="disc_likeness")

fig.show()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.graph_objects as go

def makeAxis(title, tickangle=0, tickprefix='', ticksuffix='', tickformat=''):
    ''' all-in-one axis customizer '''
    return {
      'title': title,
      'titlefont': { 'size': 20 },
      'tickangle': tickangle,
      'tickfont': { 'size': 15 },
      'tickcolor': 'rgba(0,0,0,0)',
      'tickformat': tickformat,
      'showticklabels': True,
      'showtickprefix': 'all',
      'tickprefix': tickprefix,
      'showticksuffix': 'all',
      'ticksuffix': ticksuffix,
      'ticklen': 5,
      'showline': True,
      'showgrid': True
    }

# Construct a dataframe from ASCII strings
pmi_text = ["    smiles  npr1    npr2    sphere_likeness     rod_likeness    disc_likeness",
            "0   ClCC(Cl)(Cl)Cl  0.541834    0.936058    0.477893    0.127884    3.942238e-01",
            "1   CC(Cl)(Cl)Cl    0.718463    0.718463    0.436926    0.563074    1.141665e-07",
            "2   ClC(Cl)C(Cl)Cl  0.519768    0.841920    0.361688    0.316160    3.221519e-01",
            "3   ClCC(Cl)Cl  0.498890    0.694875    0.193765    0.610249    1.959857e-01",
            "4   FC(F)(Cl)C(F)(Cl)Cl     0.720879    0.944308    0.665187    0.111383    2.234296e-01"]
t_smiles, t_npr1, t_npr2 = 'smiles', 'npr1', 'npr2'
data_raw = dict(zip(pmi_text[0][4:].split(), np.array([r[4:].split() for r in pmi_text[1:]]).T))
data_pmi = {k: (v if k == t_smiles else np.asfarray(v)) for k, v in data_raw.items()}
df = pd.DataFrame(data=data_pmi)
mat_customdata = np.stack((df[t_npr1], df[t_npr2]), axis=-1)
display(df)

t_A, t_B, t_C, t_suffix = 'rod', 'disc', 'sphere', '_likeness'
trace_name, figure_title = 'PMI', 'Principal Moments of Inertia'
fig = go.Figure( go.Scatterternary(  
    name=trace_name,
    text=df[t_smiles],
    a=df[f'{t_A}{t_suffix}'],
    b=df[f'{t_B}{t_suffix}'],
    c=df[f'{t_C}{t_suffix}'],
    customdata=mat_customdata,
    hoverlabel_align='right',
    hovertemplate = "".join(['<b>%{text}:</b><br><br>',
                             t_A + ': %{a:.6f}<br>',
                             t_B + ': %{b:.6f}<br>',
                             t_C + ': %{c:.6f}<br><br>',
                             t_npr1 + ': %{customdata[0]:g}<br>',
                             t_npr2 + ': %{customdata[1]:g}',
                             '<extra></extra>']), 
    mode='markers',
    marker={'size': 12} 
))

fig.update_layout({
    'title': figure_title,
    'ternary':
        {
        'sum': 1,
        'aaxis': makeAxis(t_A.upper() + '      .',   # '.' is for sake of alignment
                          tickprefix='r=',
                          tickformat='.2f'),
        'baxis': makeAxis(t_B.upper() + '      .', 
                          tickangle=60, 
                          tickprefix='d=',
                          tickformat='.2f'),
        'caxis': makeAxis('.           ' + t_C.upper(), 
                          tickangle=-60, 
                          tickprefix='s=',
                          tickformat='.2f'),
    },
    'showlegend': False
})
fig.show()