【发布时间】:2019-02-11 14:17:59
【问题描述】:
我正在开发一个二维平面有限元工具。其中一项功能是能够可视化特定对象上的应力。
此工具使用以下数据创建四边形网格:
节点:numpy 数组
[[x1 y1], [x2 y2], etc]->x和y网格中每个节点的坐标元素:numpy 数组
[[1 2 3 4], [2 3 5 6]]-> 数组的每一行对应于网格中一个特定元素的4 个点。
我能够实现一种绘制网格的方法:
import matplotlib.pyplot as plt
import matplotlib.collections
import matplotlib.cm as cm
import numpy as np
def showMeshPlot(nodes, elements):
y = nodes[:,0]
z = nodes[:,1]
#https://stackoverflow.com/questions/49640311/matplotlib-unstructered-quadrilaterals-instead-of-triangles
def quatplot(y,z, quatrangles, ax=None, **kwargs):
if not ax: ax=plt.gca()
yz = np.c_[y,z]
verts= yz[quatrangles]
pc = matplotlib.collections.PolyCollection(verts, **kwargs)
ax.add_collection(pc)
ax.autoscale()
plt.figure()
plt.gca().set_aspect('equal')
quatplot(y,z, np.asarray(elements), ax=None, color="crimson", facecolor="None")
if nodes:
plt.plot(y,z, marker="o", ls="", color="crimson")
plt.title('This is the plot for: quad')
plt.xlabel('Y Axis')
plt.ylabel('Z Axis')
plt.show()
nodes = np.array([[0,0], [0,0.5],[0,1],[0.5,0], [0.5,0.5], [0.5,1], [1,0],
[1,0.5],[1,1]])
elements = np.array([[0,3,4,1],[1,4,5,2],[3,6,7,4],[4,7,8,5]])
stresses = np.array([1,2,3,4])
showMeshPlot(nodes, elements)
这会产生这样的情节:
现在,我有一个一维数组,其中包含对象上的应力,长度与元素数组相同。
我的问题是如何使用 matplotlib 可视化这些压力(带有标量条)?我查看了 pcolormesh,但我不明白它如何处理我的数据。这是我想要实现的一个示例(robbievanleeuwen 的学分):
注意:我无法复制上面的示例,因为他使用三角形网格而不是四边形。
提前致谢!
【问题讨论】:
-
代码中没有
stress,代码一般是不可运行的,这里很难给出答案。这里的主要想法当然是为 PolyCollection 提供一个颜色图、一个规范和一个数组,并为该 PolyCollection 创建一个颜色条。 -
这只是我必须创建常规线框网格的方法的一个示例。我只想通过应力数组(与元素数组长度相同的一维数组)为元素赋予颜色。基本上,我想找到一种方法将我的元素数组(使用问题中显示的格式)关联到压力数组。
-
我目前看不出我上面的建议不起作用的任何原因。但是,如果您希望将其作为答案,我想确保确实如此。我只能使用问题中提供的可运行代码来做到这一点。
-
感谢您的回答,我更改了示例,现在可以使用了。基本上我希望,例如,强调[0] 与元素[0] 等相关。
标签: python matplotlib data-visualization mesh