使用多个样本进行3D表面绘图

时间:2014-05-22 03:48:31

标签: python plot 3d geometry-surface

我有一个包含多行和多列的CSV文件。例如,假设我有以下CSV(制表符分隔)文件:

    Sample1 Sample2 Sample3 Sample4 Sample5
Log1    2.3 3.3 4.5 5.6 6.7
Log2    3.5 6.7 10.0    22.1    30
Log3    4.2 4.5 6.7 8.9 9.1
Log4    4.5 8.9 10.2    11.8    14.7

我在here检查了pylab库中的曲面图方法,但我觉得我想要做的与他们提供的例子不同。因为我希望我的X轴是CSV的第一列中的名称(Log1,Log2 ... Log4),并且Y轴显示列名称(例如Sample1,Sample2,... Sample5)。这些值将决定3D图中曲面的外观。

所以我想知道如何在python或任何其他工具中制作3D表面绘图?任何回复将不胜感激。

修改

感谢@ anon的回答,我编写了以下python代码,但我不清楚如何将CSV文件中的值分配给(X,Y,Z)坐标。我在下面的方式是通过x_axis(X标签列表)和y_axis(Y标签列表)的大小分配X,Y值,Z值是我的CSV中的实际数字文件。但是下面的代码不起作用 - 需要一些额外的帮助。

csv_file_path='/path/to/my/CSV/my_file.csv'    
mFile = open(csv_file_path, 'rb')
datafile = list(csv.reader(mFile, delimiter='\t'))

x_ax = []  # a list of X labels
y_ax = []  # a list of Y labels
row_data = []  # a list of row values 
Z = []     # a list of row_data


first_line = True  # skip the first line which is the header

for row in datafile:
    print row[0]
    summ = 0

    if first_line:
        y_ax = row[1:]
        print y_ax
        first_line = False
        continue

    x_ax.append(row[0])
    row_data = row[1:]
    data.append(row_data)

X = range(len(x_ax))   # use the length of x_ax as the X coordinate
Y = range(len(y_ax))   # use the length of y_ax as the Y coordinate


fig = plt.figure(figsize=(200, 6))
ax = fig.add_subplot(1, 2, 1, projection='3d')
ax.set_xticklabels(x_ax)
ax.set_yticklabels(y_ax)
ax.set_title("Frequencies Surface Plotting")

surf = ax.plot_surface(X, Y, data, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
ax.set_zlim(0, 100)
fig.colorbar(surf, shrink = 0.5, aspect = 5)

plt.show()
来自Pylab的

示例: enter image description here

1 个答案:

答案 0 :(得分:2)

您可以将xy轴标签更改为您想要的。例如:

fig = plt.figure(figsize=(14,6))
ax = fig.add_subplot(1, 2, 1, projection='3d')
x_ax = ["Log1", "Log2"] # etc ... just parse what you need from the CSV file
ax.set_xticklabels(x_ax)
y_ax = ["Sample1","Sample2"] # etc... just parse what you need from the CSV file
ax.set_yticklabels(y_ax)
plt.show()

产地:

Changed axis

这是你想要的吗?