修剪边缘python处的matplotlib表面图颜色

时间:2018-07-06 11:32:13

标签: python matplotlib

对。

我有一些代码可以生成matplotlib 3d表面图。该代码可以工作,但是在图形的顶部边缘(使用np.nan剪切数据的位置),我得到了奇怪的彩色效果(黄色的锯齿图案)。猜测时,matplotlib似乎假设nan有一个值,并正在尝试根据该值着色图形(尽管是一种猜测...)有人可以告诉我什么吗?正在进行,我该如何纠正? a graph showing the problem

这里有一个简化的代码版本:

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

df = pd.DataFrame({10:{10:41,15:1,20:1,25:1,30:1,35:1,40:1,45:1,50:1,55:1,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   15:{10:93,15:41,20:1,25:1,30:1,35:1,40:1,45:1,50:1,55:1,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   20:{10:128,15:79,20:41,25:8,30:1,35:1,40:1,45:1,50:1,55:1,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   25:{10:np.nan,15:106,20:70,25:41,30:14,35:1,40:1,45:1,50:1,55:1,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   30:{10:np.nan,15:128,20:93,25:65,30:41,35:19,40:1,45:1,50:1,55:1,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   35:{10:np.nan,15:147,20:112,25:85,30:62,35:41,40:22,45:2,50:1,55:1,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   40:{10:np.nan,15:np.nan,20:128,25:101,30:79,35:59,40:41,45:24,50:8,55:1,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   45:{10:np.nan,15:np.nan,20:142,25:115,30:93,35:74,40:57,45:41,50:26,55:11,60:1,65:1,70:1,75:1,80:1,85:1,90:1},
                   50:{10:np.nan,15:np.nan,20:np.nan,25:128,30:106,35:87,40:70,45:55,50:41,55:28,60:14,65:1,70:1,75:1,80:1,85:1,90:1},
                   55:{10:np.nan,15:np.nan,20:np.nan,25:140,30:118,35:99,40:82,45:68,50:54,55:41,60:29,65:17,70:4,75:1,80:1,85:1,90:1},
                   60:{10:np.nan,15:np.nan,20:np.nan,25:np.nan,30:128,35:109,40:93,45:79,50:65,55:53,60:41,65:30,70:19,75:8,80:1,85:1,90:1},
                   65:{10:np.nan,15:np.nan,20:np.nan,25:np.nan,30:138,35:119,40:103,45:89,50:75,55:63,60:52,65:41,70:31,75:20,80:10,85:1,90:1},
                   70:{10:np.nan,15:np.nan,20:np.nan,25:np.nan,30:147,35:128,40:112,45:98,50:85,55:73,60:62,65:51,70:41,75:31,80:22,85:12,90:2},
                   75:{10:np.nan,15:np.nan,20:np.nan,25:np.nan,30:np.nan,35:137,40:120,45:106,50:93,55:81,60:70,65:60,70:50,75:41,80:32,85:23,90:14},
                   80:{10:np.nan,15:np.nan,20:np.nan,25:np.nan,30:np.nan,35:144,40:128,45:114,50:101,55:89,60:79,65:68,70:59,75:50,80:41,85:33,90:24},
                   85:{10:np.nan,15:np.nan,20:np.nan,25:np.nan,30:np.nan,35:np.nan,40:135,45:121,50:108,55:97,60:86,65:76,70:67,75:58,80:49,85:41,90:33},
                   90:{10:np.nan,15:np.nan,20:np.nan,25:np.nan,30:np.nan,35:np.nan,40:142,45:128,50:115,55:104,60:93,65:83,70:74,75:65,80:57,85:49,90:41}})
fig = plt.figure()
ax = Axes3D(fig)

xv, yv = np.meshgrid(df.index, df.columns)
ma = np.nanmax(df.values)
norm = matplotlib.colors.Normalize(vmin = 0, vmax = ma, clip = True)
surf = ax.plot_surface(yv,xv,df, cmap='viridis_r', linewidth=0.3,
                       alpha = 0.8, edgecolor = 'k', norm=norm)
ax.view_init(elev=24, azim=-40)
plt.show()

1 个答案:

答案 0 :(得分:1)

我目前无法确定为什么会出错,但是matplotlib似乎认为插值区域的值不在标准范围内,并使用https颜色对其进行了着色。 (我本来希望它是under颜色,所以这里可能涉及错误。)

无论如何,一种解决方案是手动设置over颜色,

under

结果如下图。

enter image description here