Я хочу создать фигуру Matplotlib только с таблицей в ней, эта таблица должна быть примерно такой же, созданной в Matlab:
![Table created in Matlab](https://i.stack.imgur.com/7mHuy.jpg)
Мне нужно отобразить столбцы с плавающей точкой и столбец со строками для "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()
Но проблема здесь в том, что он отображает только первый символ каждого элемента
![Bad table with Matplotlib](https://i.stack.imgur.com/zVAeR.jpg)
Еще одна проблема, с которой я столкнулся, заключалась в том, что в столбце с именами строк была обрезана таблица. Существует ли способ форматирования ячеек, чтобы они соответствовали данным без какого-либо небольшого свободного места?
Спасибо!
Edit1:
Благодаря @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: я забыл добавить изображение таблицы вырезов, вот оно: ![Cut final table](https://i.stack.imgur.com/7LrHI.jpg)
Edit3: найти не так уж и красивое решение В окне изображения есть кнопка, которая позволяет изменить расположение таблицы (я не знал об этом, когда отправил вопрос). Я изменяю значения в этом диалоговом окне:
Затем я изучил Matplotlib Matplotlib, отрегулируйте документацию и, наконец, добавил эту строку в код 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()