【问题标题】:Creating a table with matplotlib, columns with floats and other column with strings?创建一个带有 matplotlib 的表、带有浮点数的列和其他带有字符串的列?
【发布时间】: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()

Edit2:我忘了添加切割表图像,这里是:

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


【解决方案1】:

我无法告诉您如何防止 pandas 截断字符串,但您可以通过将构造函数 pd.DataFrame() 传递为两个列表来绕过它,如

pd.DataFrame({'Magnitud' : parametros.tolist(), 'Unidad' : unidades.tolist()})

这将截断数据框第二列中的字符串。

完整示例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

fig, ax = plt.subplots(dpi=200)

# 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","$"])

df = pd.DataFrame({'Magnitud' : parametros.tolist(), 'Unidad' : unidades.tolist()})

ax.table(cellText=df.values, rowLabels=propiedades, colLabels=df.columns, 
         cellLoc='center', loc='center')
fig.tight_layout()
plt.show()

【讨论】:

  • 谢谢,这解决了 1 个问题,但是现在当我使用这种方法制作相同的原始表格(Matlab 表格)时,我遇到了原始问题中描述的另一个问题,即图形被切入带有 rowLabels 的列。接下来我将发布包含完整表格数据的代码。
  • @Azimuth 你能贴一张新问题输出的图片吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2012-08-12
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多