Python 是否可以使matplotlib轮廓平滑更粗糙?
我正在尝试对我的特殊数据做一些轮廓。我正在使用matplotlib contour和SciPy griddata例程来实现这一点。但是轮廓线非常详细,而且过于零碎。我想实现更粗糙的分布。我的最小化python代码如下所示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
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选项来获得平滑曲线。对于粗略近似,这将是足够的解决方案。当然,一些数据点将被忽略,以便进行粗略的近似。