微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我试图得到一个三元图,以了解某些化合物形状的多样性。当使用plotly绘制sphere_likeness,rod_likeness和disc_likeness时,它给出了一个很好的梯形图,显示了所有化合物的多样性。但是常规上,分子的PMI图被绘制为倒三角形。谁能告诉我如何反转三角图,这是我执行以下命令后获得的帮助。谢谢你。

df.head(5)

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

enter image description here

解决方法

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)','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=','caxis': makeAxis('.           ' + t_C.upper(),tickangle=-60,tickprefix='s=',},'showlegend': False
})
fig.show()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。