Python 是否可以使matplotlib轮廓平滑更粗糙?

Python 是否可以使matplotlib轮廓平滑更粗糙?,python,matplotlib,Python,Matplotlib,我正在尝试对我的特殊数据做一些轮廓。我正在使用matplotlib contour和SciPy griddata例程来实现这一点。但是轮廓线非常详细,而且过于零碎。我想实现更粗糙的分布。我的最小化python代码如下所示 import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.ticker as ticker from scipy.interpolate import gri

我正在尝试对我的特殊数据做一些轮廓。我正在使用matplotlib contour和SciPy griddata例程来实现这一点。但是轮廓线非常详细,而且过于零碎。我想实现更粗糙的分布。我的最小化python代码如下所示

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from scipy.interpolate import griddata
import matplotlib.cm as cm
from matplotlib.colors import LinearSegmentedColormap

data = np.array([
    [-1.685, 0.588, 1.779], [ 2.526, 0.486, 1.704], [ 1.073, 1.434, 1.774],
    [ 0.368,-0.209, 1.777], [ 0.741, 0.416, 1.772], [-0.637,-0.141, 1.698],
    [-0.834,-0.772, 1.754], [ 0.003, 1.534, 1.818], [ 2.950, 0.464, 1.603],
    [-2.615, 0.111, 1.867], [-1.282, 0.159, 1.848], [ 0.928, 1.284, 1.700],
    [-1.574, 0.198, 1.867], [ 2.583,-0.289, 1.808], [-2.102, 0.661, 1.978],
    [ 1.905,-0.601, 1.859], [ 1.226,-0.069, 1.847], [-1.524, 0.629, 2.008],
    [-0.242,-0.197, 1.794], [-1.245, 0.616, 1.754], [-1.474, 0.468, 1.908],
    [ 1.213,-0.962, 1.713], [-0.462, 0.469, 1.854], [-0.872,-0.127, 1.824],
    [-0.280, 0.723, 1.783], [-0.325, 0.749, 1.853], [-1.617, 0.056, 1.924],
    [-1.682, 0.731, 1.863], [-1.034,-0.469, 1.706], [ 0.42, -0.291, 1.905],
    [ 0.276, 1.124, 1.843], [ 2.938, 0.724, 1.581], [ 0.67, -0.299, 1.796],
    [-2.222,-0.584, 1.752], [-2.047,-0.441, 1.668], [-0.162, 0.054, 1.650],
    [-0.342,-0.649, 1.776], [-0.557,-0.591, 1.816], [-0.157, 0.103, 1.863],
    [ 0.803,-0.562, 1.706], [-0.607, 0.539, 1.824], [ 1.576, 0.298, 1.826],
    [-0.259,-0.597, 1.825], [ 1.12,  1.863, 1.698], [-0.95,  0.258, 1.778],
    [ 1.623, 1.468, 1.592], [-1.619,-0.019, 1.706], [-2.744,-0.701, 1.973],
    [ 0.373, 0.096, 1.609], [-1.049, 0.774, 1.674], [ 2.598, 0.079, 1.704],
    [ 1.028, 0.994, 1.708], [-0.012,-0.799, 1.816], [-1.544, 0.159, 1.752],
    [-0.982,-0.034, 1.686], [-2.18,  1.319, 1.924], [ 0.473, 0.444, 1.625],
    [-0.39,  1.279, 2.014], [-1.659,-0.734, 2.060], [ 0.423, 0.358, 1.762],
    [-0.879, 0.168, 1.640]
    ])


fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8.09,3.92))
fig.subplots_adjust(left=0.093, bottom=0.135, right=0.982, top=0.975, hspace=0.0, wspace=0.0)

ax.set_xlim(-3.0, 3.0)
ax.set_ylim(-1.0, 2.0)
ax.set_xlabel(r'$\Delta\alpha (^{\prime})$')
ax.set_ylabel(r'$\Delta\delta (^{\prime})$')
ax.invert_xaxis()

ax.minorticks_on()
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
ax.xaxis.set_minor_locator(ticker.AutoMinorLocator(1))
ax.yaxis.set_major_locator(ticker.MultipleLocator(0.4))
ax.yaxis.set_minor_locator(ticker.AutoMinorLocator(2))

ax.tick_params(axis="both", direction='in',which='major', length=5, top=True, right=True)
ax.tick_params(axis="both", direction='in',which='minor', length=3, top=True, right=True)
ax.axvline(x=0, color='k', linestyle='--', dashes=(7, 5), linewidth=0.6)
ax.axhline(y=0, color='k', linestyle='--', dashes=(7, 5), linewidth=0.6)

x = data[:,0]
y = data[:,1]
z = data[:,2]

ax.scatter(x, y, s=5, c='r')       # x,y data

xi, yi = np.mgrid[-3.0:3.0:20j, -1.0:2.0:10j]
zi = griddata((x,y), z, (xi,yi), method='cubic')        # make grid data

contour_labels = ax.contour(xi, yi, zi, levels=[1.6, 1.7, 1.75, 1.8], colors='k', linewidths=0.8)
ax.clabel(contour_labels, fmt='%1.2f', colors='k', fontsize=8, inline=True, inline_spacing=0)

plt.show()
这个代码给了我一个这样的数字

是否有可能获得下图(这是由Grapher of Golden Software制作的)


我怎样才能得出这个数字?有没有办法在python中实现这一点?

使用
scipy.ndimage.zoom
平滑网格化数据并打印。以下是相关代码和示例图:-

...
# require ndimage
from scipy import ndimage

...
# use `nearest` in stead of others
zi = griddata((x,y), z, (xi,yi), method='nearest') 

# resample your data grid by a factor of 4 using cubic spline interpolation
pw = 4
xm = ndimage.zoom(xi, pw)
ym = ndimage.zoom(yi, pw)
zm = ndimage.zoom(zi, pw)
contour_labels = plt.contour(xm, ym, zm, levels=[1.6, 1.7, 1.75, 1.8], colors='k', linewidths=0.8)
ax.clabel(contour_labels, fmt='%1.2f', colors='k', fontsize=8, inline=True, inline_spacing=0)

plt.show()
输出曲线图:


使用
scipy.ndimage.zoom
平滑网格化数据并打印。以下是相关代码和示例图:-

...
# require ndimage
from scipy import ndimage

...
# use `nearest` in stead of others
zi = griddata((x,y), z, (xi,yi), method='nearest') 

# resample your data grid by a factor of 4 using cubic spline interpolation
pw = 4
xm = ndimage.zoom(xi, pw)
ym = ndimage.zoom(yi, pw)
zm = ndimage.zoom(zi, pw)
contour_labels = plt.contour(xm, ym, zm, levels=[1.6, 1.7, 1.75, 1.8], colors='k', linewidths=0.8)
ax.clabel(contour_labels, fmt='%1.2f', colors='k', fontsize=8, inline=True, inline_spacing=0)

plt.show()
输出曲线图:


在@swatchai近似的帮助下,我改变了一些参数,得到了一个可接受的结果。我换了线路

xi, yi = np.mgrid[-3.0:3.0:20j, -1.0:2.0:10j]
这条线

xi, yi = np.mgrid[-3.0:3.0:6j, -1.0:2.0:4j]
并重新编写了一些代码行作为

zi = griddata((x,y), z, (xi,yi), method='nearest')

pw = 8.
xm = zoom(xi, pw)
ym = zoom(yi, pw)
zm = zoom(zi, pw)

seclvls = [1.6, 1.7, 1.75, 1.8]

contour_labels = ax.contour(xm, ym, zm, levels=seclvls, linewidths=0.8, colors='k')
由于这些变化,我得到了这个数字


虽然我没有得到我想要的确切结果,但这是一个可以接受的结果。

在@swatchai近似的帮助下,我更改了一些参数,得到了一个可以接受的结果。我换了线路

xi, yi = np.mgrid[-3.0:3.0:20j, -1.0:2.0:10j]
这条线

xi, yi = np.mgrid[-3.0:3.0:6j, -1.0:2.0:4j]
并重新编写了一些代码行作为

zi = griddata((x,y), z, (xi,yi), method='nearest')

pw = 8.
xm = zoom(xi, pw)
ym = zoom(yi, pw)
zm = zoom(zi, pw)

seclvls = [1.6, 1.7, 1.75, 1.8]

contour_labels = ax.contour(xm, ym, zm, levels=seclvls, linewidths=0.8, colors='k')
由于这些变化,我得到了这个数字


虽然我没有得到我想要的确切结果,但这是一个可以接受的结果。

这是否回答了您的问题?您只需要在网格中添加更多点:
xi,yi=np.mgrid[-3.0:3.0:60j,-1.0:2.0:30j]
@JohanC我尝试了此选项,获得了更平滑的结果。但是图形的外观没有改变。这是否回答了你的问题?您只需要在网格中添加更多点:
xi,yi=np.mgrid[-3.0:3.0:60j,-1.0:2.0:30j]
@JohanC我尝试了此选项,获得了更平滑的结果。但是图形的外观没有改变。感谢@swatchai,您的近似值给出了一个可接受的解决方案。感谢@swatchai,您的近似值给出了一个可接受的解决方案。此外,您可以在这里增加缩放因子,例如
pw=20
,以获得更平滑的图像。请注意,这种方法首先将数据映射到一个由24个点组成的网格。这将忽略许多原来给定的高度;它只考虑了恰好靠近网格点的原始数据。我尝试了pw=20选项来获得平滑曲线。对于粗略近似,这将是足够的解决方案。当然,为了进行粗略的近似,数据中的一些点将被忽略。在这里,您还可以增加缩放因子,例如
pw=20
,以获得更平滑的图像。请注意,这种方法首先将数据映射到24个点的网格。这将忽略许多原来给定的高度;它只考虑了恰好靠近网格点的原始数据。我尝试了pw=20选项来获得平滑曲线。对于粗略近似,这将是足够的解决方案。当然,一些数据点将被忽略,以便进行粗略的近似。