【发布时间】:2019-01-09 16:08:52
【问题描述】:
我想创建一个只有一个表的 Matplotlib 图,这个表应该是在 Matlab 中创建的:
我需要显示带有浮点数的列,以及带有“Unidades”字符串的列。
我尝试在 Python 中使用 Matplotlib、Numpy、Pandas 和 Spyder 实现这一点。 注意:表格和数据和用matlab做的图片不一样,但是我需要那个表格的结构,我还是漏掉了表格的标题。
在尝试了几次之后,在将浮点数和字符串合并到一个 Numpy 数组中进行绘图时遇到问题,我想出了这个:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# hide axes
fig.patch.set_visible(False)
ax.axis('off')
ax.axis('tight')
mlamb= 10.03724236064883
d= 0.48815610164066126 #[m]
e= 4.8815610164066126 #[mm]
v= 1.0495771928993183 #[m/s]
f= 0.04161227375782485
p1= 5.976000000000005 #[MPa]
X= 4.8459009928884695
N= 1529.742063492065 #[kW]
k3= 4.851121433427204 #[$/kW]
k03= 7420964.511821515 #[$]
parametros=np.around(np.array([mlamb,d,e,v,f,p1,X,N,k3,k03]),3)
string_magnitudes=str(parametros)
propiedades=np.array(["-lambda","Diametro","Espesor","Velocidad",
"Factor de friccion","Presion p1","Plantas de bombeo (X)"
,"Potencia","k3","k03"])
unidades=np.array(["-","m","mm","m/s","-","MPa","unidades","kW","$/kW","$"])
datos=np.zeros((10,2),str)
for r in range(0,len(parametros)):
datos[r,0]=parametros[r]
datos[r,1]=parametros[r]
df = pd.DataFrame(datos, columns=['Magnitud','Unidad'])
ax.table(cellText=df.values, rowLabels=propiedades, colLabels=df.columns, cellLoc='center', loc='center')
fig.tight_layout()
plt.show()
但这里的问题是它只显示每个元素的第一个字符
我遇到的另一个问题是表格在行名的列中被截断,有没有一种方法可以格式化单元格,以便它们适合没有/很少的备用空间的数据?
谢谢!
编辑1: 感谢@William Miller,我可以打印表格。但是,当我使用这种方法制作相同的原始表(Matlab 表)时,我在原始问题中描述了另一个问题,即图形在带有 rowLabels 的列中被剪切,这里是完整原始表的代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig, ax = plt.subplots()
# hide axes
fig.patch.set_visible(False)
ax.axis('off')
ax.axis('tight')
parametros=np.array(["Diámetro comercial (dcom)","Espesor comercial (ecom)",
"Plantas de bombeo (X)","Factor de fricción (f)",
"Presión inicial (p1)",
"Variación de presión total (Delta Ptot)",
"Variación de presión entre plantas de bombeo (DeltaPx)",
"Presión final (p2)"])
unidades=np.array(['m','mm','-','-','MPa','MPa','MPa','MPa'])
datos_caso1=np.array([0.457, 5.6, 4, 0.04080925, 5.976, 36.67886619,
9.16971655, -3.19371655])
datos_caso2=np.array([0.457, 5.6, 5, 0.04080925, 5.976, 36.67886619,
7.33577324, -1.35977324])
datos_caso3=np.array([0.508, 5.6, 4, 0.04216189, 5.976, 23.7697998 ,
5.94244995, 0.03355005])
datos_caso4=np.array([0.508, 5.6, 5, 0.04216189, 5.976, 23.7697998 ,
4.75395996, 1.22204004])
df = pd.DataFrame({'Caso 1' : datos_caso1.tolist(),
'Caso 2' : datos_caso2.tolist(),
'Caso 3' : datos_caso3.tolist(),
'Caso 4' : datos_caso4.tolist(),
'Unidad' : unidades.tolist()})
ax.table(cellText=df.values, rowLabels=parametros, colLabels=df.columns, cellLoc='center', loc='center')
fig.tight_layout()
plt.show()
Edit3:找到一个不那么花哨的解决方案。在图像框中有一个按钮可以修改表格的位置(我发布问题时不知道)。我修改此对话框中的值:
然后我查看了 Matplotlib Matplotlib adjust documentation,最后在代码中添加了这一行 plt.subplots_adjust(top=0.97, bottom=0.08, left=0.205, right=0.98, hspace=0.20,wspace=0.20) 我不得不评论这一行 fig.tight_layout() 以使更改生效。
这是最终结果:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig, ax = plt.subplots()
# hide axes
fig.patch.set_visible(False)
ax.axis('off')
ax.axis('tight')
parametros=np.array(["Diametro comercial (dcom)","Espesor comercial (ecom)",
"Plantas de bombeo (X)","Factor de friccion (f)",
"Presion inicial (p1)",
"Variacion de presion total (Delta Ptot)",
"Variacion de presion entre plantas de bombeo (DeltaPx)",
"Presion final (p2)"])
unidades=np.array(['m','mm','-','-','MPa','MPa','MPa','MPa'])
datos_caso1=np.array([0.457, 5.6, 4, 0.04080925, 5.976, 36.67886619,
9.16971655, -3.19371655])
datos_caso2=np.array([0.457, 5.6, 5, 0.04080925, 5.976, 36.67886619,
7.33577324, -1.35977324])
datos_caso3=np.array([0.508, 5.6, 4, 0.04216189, 5.976, 23.7697998 ,
5.94244995, 0.03355005])
datos_caso4=np.array([0.508, 5.6, 5, 0.04216189, 5.976, 23.7697998 ,
4.75395996, 1.22204004])
df = pd.DataFrame({'Caso 1' : datos_caso1.tolist(),
'Caso 2' : datos_caso2.tolist(),
'Caso 3' : datos_caso3.tolist(),
'Caso 4' : datos_caso4.tolist(),
'Unidad' : unidades.tolist()})
ax.table(cellText=df.values, rowLabels=parametros, colLabels=df.columns, cellLoc='center', loc='center')
plt.subplots_adjust(top=0.97, bottom=0.08, left=0.205, right=0.98, hspace=0.20,
wspace=0.20)
#fig.tight_layout()
plt.show()
【问题讨论】:
-
如果你使用
plt.savefig()而不是plt.show(),会发生同样的切割吗? -
是的,它也一样,我没有给
plt.savefig()任何参数,我不知道如何指定文件的路径,或者是否有必要这样做。跨度> -
Windows 的示例用法为
plt.savefig("C:/Users/username/Documents/plotname.png")。当我运行您的确切代码(任何字符上没有重音符号)时,我得到this,因此它必须与图像的显示或保存方式有关。 -
这很奇怪。我仍然得到相同的剪切图像,用
plt.savefig("C:/Users/username/Documents/plotname.png")指定路径,或者用plt.show()显示带有或不带有重音的图像。我用的是1920x1080p的笔记本屏幕,你们的屏幕分辨率一样吗? -
注释掉
fig.patch.set_visible会是什么样子?
标签: python matlab matplotlib