【发布时间】:2022-01-01 18:22:18
【问题描述】:
我正在尝试绘制这个等式 r=a(sin^3theta+cos^3theta) 或
x = a * cos theta(sin^3theta+cos^3theta)
y = a * sin theta(sin^3theta+cos^3theta)
结果是利马豆。但是,我有两个问题。第一个问题是,在 bean 的右下中心部分有一个凸起,看起来好像绘制了太多点,并且图形重叠并突然停止。
第二个问题是平滑要导出为 png 以供以后操作的图形。我已经通过将plt.save fig 用于 SVG 解决了这个问题,曲线变得非常平滑。但是,我留下了那个凹凸问题。
我知道 SciPy 有一个插值功能,但我还不确定如何实现它,或者如果我仍然有这个奇怪的凸起是否值得。
import numpy as np
from matplotlib import pyplot as plt
t = np.arange(0, 2*np.pi, .01)[1:]
#t = np.linspace(0,2*np.pi,100)
x = 16 * np.cos(t)*((np.sin(t)**3) + np.cos(t)**3)
y = 13 * np.sin(t)*((np.sin(t)**3) + np.cos(t)**3)
fig = plt.figure(figsize = (5, 5), dpi=72)
ax = fig.add_subplot(polar = False)
ax.plot(x, y, c=(1,0.2,0.5),lw=15)
plt.axis('off')
#plt.show()
plt.savefig("filepath.svg", format = 'svg', dpi=300)
不需要 300 dpi 我只是在测试它对图像的影响。
尽管这在技术上不是一个圆圈,但它仍然应该是 2 * Pi 才能完成一个完整的旋转。
将停止点调整为 1 而不是 0 可以修复凹凸,但在视觉上将其切成两半。即使我使用了3 * Pi,凹凸仍然存在。
我使用了 matplotlib 的 Polar 模式,但它的大小和位置有限。使用参数方程似乎更容易配置。
与 SVG 相比,IIRC png 在其他 python 程序中更容易操作。但目前,作为 png,它看起来很糟糕。
【问题讨论】:
-
15 的线条粗细是影响凹凸怪异度的最大因素。您可以尝试使用更薄的东西。要获得更平滑的 png 文件,您可以尝试更大的 dpi。
t的最平滑值类似于t = np.linspace(-np.pi/2, np.pi/2,500)。 -
请参阅this wiki page,了解尝试仅通过线条粗细创建平行曲线时出现的奇怪情况。一般来说,没有一种万能的解决方案可以为曲线提供直观的粗细。
-
因为这个方程已经创建了超过 180º 的完整曲线。从 -np.pi/2 开始让曲线从左下点开始,该点曲线最平滑。起点和终点会使曲线的显示方式有些不连续,因此最好让它们远离您最感兴趣的区域。
-
在 bean 的顶部和底部添加额外曲线的数学运算是什么?也许这样可以隐藏凹凸。
-
我试过
ax.fill(np.r_[x * 1.01, x[::-1] * 0.95], np.r_[y * 1.01, y[::-1] * 0.95], c=(1, 0.2, 0.5)),但由于曲线不是以 0,0 为中心,因此厚度变化很大。此外,一些凹凸只是数学曲线的一部分,因此似乎没有必要隐藏它。
标签: python numpy matplotlib graph geometry