Python绘制三元相图并显示温度分布

想请问一下这种图像用python是如何画出来的,或者有没有其它方法可以画出来?有代码的话最好

img

这个总结的比较全

参考GPT和自己的思路,绘制三元相图可以使用Python中的matplotlib和ternary库来实现。以下是一个简单的示例代码,用于绘制一个具有温度分布的三元相图:

import numpy as np
import matplotlib.pyplot as plt
import ternary

# 定义数据
data = np.random.rand(100, 3)
temps = np.linspace(0, 100, len(data))
data[:, 0] += temps * 0.01
data[:, 1] += temps * 0.02
data[:, 2] += temps * 0.03

# 绘制图像
figure, tax = ternary.figure()
tax.heatmap(data, cmap='jet', style='triangular')
tax.boundary(linewidth=2.0)
tax.set_title('Temperature Distribution')
tax.left_axis_label('Component C')
tax.right_axis_label('Component A')
tax.bottom_axis_label('Component B')
tax.gridlines(multiple=0.1, color="black")
tax.ticks(multiple=0.1, linewidth=1)
tax.get_axes().axis('off')
plt.show()


代码中,我们使用numpy生成100个随机的三元组数据,并且使用np.linspace生成了100个等差数列作为温度分布。然后,我们将每个数据点的三个分量都加上一定比例的温度,这样就可以模拟出温度分布的效果。

接着,我们使用ternary库中的figure()函数创建一个绘图对象,并且使用heatmap()函数将数据绘制在三元相图上。我们还可以设置绘图的样式、标题、坐标轴标签、网格线等等。最后,使用plt.show()函数将图像显示出来。

这是一个简单的示例代码,您可以根据自己的需求进行修改和定制。

使用 Python 绘制三元相图并显示温度分布可以通过以下步骤实现:

  1. 导入必要的库和模块
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable
  1. 生成数据

可以使用 np.meshgrid() 函数生成 $x,y$ 坐标网格,使用 np.zeros() 函数初始化温度分布,使用 np.array() 函数初始化温度分布的变化范围。

x = np.linspace(0, 1, 21)
y = np.linspace(0, 1, 21)
X, Y = np.meshgrid(x, y)

T = np.zeros([21, 21, 21])
T[:, :, 0] = 1
T[0, :, :] = 0
T[-1, :, :] = Y
T[:, -1, :] = X

levels = np.array([0, 0.25, 0.5, 0.75, 1])
  1. 绘制三元相图

可以使用 plt.tricontourf() 函数绘制三元相图,并使用 plt.colorbar() 函数添加颜色条。

fig, ax = plt.subplots(figsize=(8, 8))
tricontour = ax.tricontourf(X.flatten(), Y.flatten(), T[:, :, 0].flatten(), levels, cmap='cool')
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.1)
plt.colorbar(tricontour, cax=cax)
ax.set_xticks(x)
ax.set_yticks(y)
ax.set_xlabel("x")
ax.set_ylabel("y")
  1. 循环计算并更新温度分布

使用双重循环计算,对于每个 $x_i, y_j$,根据相邻的温度分布计算新的温度值,更新温度分布,并将其显示在三元相图上。

for k in range(1, 21):
    for i in range(1, 20):
        for j in range(1, 20):
            T[i, j, k] = (T[i+1, j, k-1] + T[i-1, j, k-1] + T[i, j+1, k-1] + T[i, j-1, k-1] + T[i, j, k-1])/5

    tricontour = ax.tricontourf(X.flatten(), Y.flatten(), T[:, :, k].flatten(), levels, cmap='cool')
    plt.pause(0.01)

plt.show()

完整代码如下:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

# 生成数据
x = np.linspace(0, 1, 21)
y = np.linspace(0, 1, 21)
X, Y = np.meshgrid(x, y)

T = np.zeros([21, 21, 21])
T[:, :, 0] = 1
T[0, :, :] = 0
T[-1, :, :] = Y
T[:, -1, :] = X

levels = np.array([0, 0.25, 0.5, 0.75, 1])

# 绘制三元相图
fig, ax = plt.subplots(figsize=(8, 8))
tricontour = ax.tricontourf(X.flatten(), Y.flatten(), T[:, :, 0].flatten(), levels, cmap='cool')
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.1)
plt.colorbar(tricontour, cax=cax)
ax.set_xticks(x)
ax.set_yticks(y)
ax.set_xlabel("x")
ax.set_ylabel("y")

# 循环计算并更新温度分布
for k in range(1, 21):
    for i in range(1, 20):
        for j in range(1, 20):
            T[i, j, k] = (T[i+1, j, k-1] + T[i-1, j, k-1] + T[i, j+1, k-1] + T[i, j-1, k-1] + T[i, j, k-1])/5

    tricontour = ax.tricontourf(X.flatten(), Y.flatten(), T[:, :, k].flatten(),for k in range(1, 21):
    for i in range(1, 20):
        for j in range(1, 20):
            T[i, j, k] = (T[i+1, j, k-1] + T[i-1, j, k-1] + T[i, j+1, k-1] + T[i, j-1, k-1] + T[i, j, k-1])/5
    tricontour = ax.tricontourf(X.flatten(), Y.flatten(), T[:, :, k].flatten(), levels, cmap='cool')
    plt.pause(0.01)
plt.show()

该回答引用GPTᴼᴾᴱᴺᴬᴵ
要绘制三元相图并显示温度分布,可以使用Python中的matplotlib和mpltern库。mpltern是一个专门用于三元图的库,可以轻松地绘制三元图,并支持添加温度分布等色图。

以下是一个绘制三元相图并显示温度分布的示例代码:

import numpy as np
import matplotlib.pyplot as plt
import mpltern

# 生成三元数据
data = np.random.rand(100, 3)

# 创建三元坐标系
figure = plt.figure()
ax = mpltern.TernaryAxesSubplot(figure, 111)

# 绘制散点图
ax.scatter(data[:, 0], data[:, 1], data[:, 2], s=10, edgecolors='none', cmap='jet')

# 添加温度分布等色图
temperatures = np.random.rand(100)
ax.tricontourf(data[:, 0], data[:, 1], data[:, 2], temperatures, cmap='coolwarm')

# 设置坐标轴标签
ax.set_tlabel('Component A')
ax.set_alabel('Component B')
ax.set_blabel('Component C')

# 显示图形
plt.show()


在代码中,首先使用numpy库生成了随机的三元数据,然后创建了mpltern库的三元坐标系,并在坐标系中绘制了三元散点图。接着使用tricontourf函数添加了温度分布等色图,并使用set_tlabel、set_alabel和set_blabel设置了坐标轴标签。最后调用show函数显示图形。

需要注意的是,因为三元坐标系与二元坐标系有所不同,所以使用mpltern库需要一些特殊的语法和参数,具体可以参考mpltern的文档。

这种图像属于三维散点图,可以使用Python中的Matplotlib库来绘制。
以下是一个简单的示例代码,可以绘制出一张类似的图像:

python
Copy code
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(42)
x = np.random.normal(size=500)
y = np.random.normal(size=500)
z = np.random.normal(size=500)
# 绘制散点图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c=z, cmap='coolwarm', s=50, alpha=0.5)
# 设置坐标轴标签
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()

其中,x、y、z是三个一维数组,代表散点图的三个维度。c=z表示根据z的值来给散点着色,cmap='coolwarm'表示使用蓝色到红色的渐变色。s=50表示散点的大小为50,alpha=0.5表示散点的透明度为0.5。
如果要绘制更加复杂的三维图像,可以参考Matplotlib官方文档中的相关教程。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
要画出三元相图并显示温度分布,可以使用Python中的matplotlib和numpy库。以下是一份可能的代码示例:

import matplotlib.pyplot as plt
import numpy as np

# 定义三阶段化合物的成分比例范围和温度范围
x = np.linspace(0, 1, 100)  # A成分比例
y = np.linspace(0, 1, 100)  # B成分比例
z = np.linspace(0, 1, 100)  # C成分比例
temp = np.linspace(0, 1000, 11)  # 温度范围

# 定义三阶段化合物的相图方程
def f_phase_A(x, y, z):
    return (z > 0.5) & (y < 1 - z) & (x < z - y + 0.5)

def f_phase_B(x, y, z):
    return (z < 0.5) & (y > 0.5 - z) & (x < z - y + 0.5)

def f_phase_C(x, y, z):
    return (y > z) & (x > 1 - y - z)

# 计算三阶段化合物的相图和温度分布
A_phase = np.zeros((len(x), len(y), len(z)))
B_phase = np.zeros((len(x), len(y), len(z)))
C_phase = np.zeros((len(x), len(y), len(z)))
temp_dist = np.zeros((len(x), len(y), len(z)))
for i in range(len(x)):
    for j in range(len(y)):
        for k in range(len(z)):
            if f_phase_A(x[i], y[j], z[k]):
                A_phase[i, j, k] = 1
                temp_dist[i, j, k] = 500 + 50 * (y[j] + z[k] - 1)
            elif f_phase_B(x[i], y[j], z[k]):
                B_phase[i, j, k] = 1
                temp_dist[i, j, k] = 500 + 50 * (1 - y[j] + z[k])
            elif f_phase_C(x[i], y[j], z[k]):
                C_phase[i, j, k] = 1
                temp_dist[i, j, k] = 500 + 50 * (1 - x[i] - y[j] - z[k])

# 显示三阶段化合物的相图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[A_phase == 1], y[A_phase == 1], z[A_phase == 1], color='r', marker='o')
ax.scatter(x[B_phase == 1], y[B_phase == 1], z[B_phase == 1], color='g', marker='o')
ax.scatter(x[C_phase == 1], y[C_phase == 1], z[C_phase == 1], color='b', marker='o')
ax.set_xlabel('A')
ax.set_ylabel('B')
ax.set_zlabel('C')
ax.view_init(elev=25, azim=-135)
plt.show()

# 显示温度分布
fig = plt.figure(figsize=(8, 8))
for t in temp:
    temp_plane = temp_dist[:, :, int(t / 1000 * 100)]
    plt.contourf(x, y, temp_plane, levels=20, cmap='hot')
    plt.title('Temperature distribution (K)')
    plt.xlabel('A')
    plt.ylabel('B')
    plt.colorbar()
    plt.show()

这份代码中,我们首先定义了A、B、C三种成分的比例范围和温度范围。接下来,我们定义了三个函数f_phase_A、f_phase_B和f_phase_C来计算三阶段化合物的相图方程。在代码中我们通过三重循环遍历了所有(x, y, z)的组合,计算出每一个点的三阶段化合物类型和对应的温度分布。

在显示三阶段化合物的相图时,我们通过matplotlib库中的mplot3d子库画出了一个三维散点图,根据每个点(x, y, z)的三阶段化合物类型使用红色、绿色、蓝色来标记。

在显示温度分布时,我们使用matplotlib库中的contourf函数,根据每个点(x, y)的温度分布,用热力图的形式将温度分布显示出来。同时我们设置了20个等高线水平面和色图为热力图,方便观察温度分布的变化。
如果我的回答解决了您的问题,请采纳!