当前位置: 首页 > 知识库问答 >
问题:

如何使图形的背景透明?[副本]

江煜
2023-03-14

我在这里绘制贝塞尔曲线,但我计划将图片保存为无背景的透明格式。根据我下面的绘图,我想让背景像没有背景的PNG图形一样透明。我只需要显示曲线和轴。我试着将其保存为PNG,但没有成功。可能吗?需要帮忙吗?

import numpy as np
import scipy.special
import matplotlib.pyplot as plt

def calc_bezier_path(control_points, n_points=100):
    """
    Compute bezier path (trajectory) given control points.
    :param control_points: (numpy array)
    :param n_points: (int) number of points in the trajectory
    :return: (numpy array)
    """
    traj = []
    for t in np.linspace(0, 1, n_points):
        traj.append(bezier(t, control_points))

    return np.array(traj)


def bernstein_poly(n, i, t):
    """
    Bernstein polynom.
    :param n: (int) polynom degree
    :param i: (int)
    :param t: (float)
    :return: (float)
    """
    return scipy.special.comb(n, i) * t ** i * (1 - t) ** (n - i)


def bezier(t, control_points):
    """
    Return one point on the bezier curve.
    :param t: (float) number in [0, 1]
    :param control_points: (numpy array)
    :return: (numpy array) Coordinates of the point
    """
    n = len(control_points) - 1
    return np.sum([bernstein_poly(n, i, t) * control_points[i] for i in range(n + 1)], axis=0)

def line_bezier(visx, visy, control, mod="nothing"):
    vis = np.column_stack((visx,visy))
    path_x, path_y = np.array([]),np.array([])
    setting = {"nothing":[len(vis)-2, 1, 1], "start":[len(vis)-1, 0, 0], "end":[len(vis)-1, 1, 0], "both":[len(vis), 0, -1]}
    epoch = setting[mod][0]
    start = setting[mod][1]
    end = setting[mod][2]
    if len(vis) > 2:
        current_control = vis[0]
        for x in range(epoch):
            if x != (epoch-1):
                for y in control:
                    
                    mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                    mid_control2 = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y-0.1), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y-0.1)]
                    if y == control[0]:
                        #plt.annotate(f"M{x}", mid_control)
                        plt.annotate("*", mid_control2)
                        bezier_line = calc_bezier_path(np.array([current_control,vis[x+start], mid_control]))
                        path_x = np.append(path_x, bezier_line.T[0])
                        path_y = np.append(path_y, bezier_line.T[1])
                        current_control = mid_control
                    else:
                        mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                        #plt.annotate(f"M{x}", mid_control)
                        plt.annotate("*", mid_control2)
                        bezier_line = calc_bezier_path(np.array([current_control, mid_control]))
                        path_x = np.append(path_x, bezier_line.T[0])
                        path_y = np.append(path_y, bezier_line.T[1])
                        current_control = mid_control
                        
            else:
                if mod == "end" or mod == "both":
                    bezier_line = calc_bezier_path(np.array([current_control, vis[x+(end+1)]]))
                else:
                    bezier_line = calc_bezier_path(np.array([current_control, vis[x+end], vis[x+(end+1)]]))
                path_x = np.append(path_x, bezier_line.T[0])
                path_y = np.append(path_y, bezier_line.T[1])
    else:
        path_x, path_y = visx, visy
    return path_x, path_y

visx, visy = [1,2,10,15,20,25,21], [0,5,1,4,2,3,3]
control = [0.25,0.75]
path_x, path_y = line_bezier(visx, visy, control,mod="end")
plt.plot(path_x, path_y)
plt.plot(visx, visy, "--o")

for a,b in zip(np.linspace(0,visx[-1],num=100), np.linspace(0,visy[-1],num=100)):
    for n in control:
        if n == round(a,1):
            plt.scatter(n, b)
for xy in range(len(visx)):
    plt.annotate(f"P{xy}", [visx[xy], visy[xy]])

plt.xlabel('X')
plt.ylabel('Y')
plt.show()

共有1个答案

罗伟兆
2023-03-14

您可以将情节保存为透明图片:

而不是plt。show()使用plt。savefig(fname=“test.png”,transparent=True)

在这里查看更多选项:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html#matplotlib-pyplot-savefig

 类似资料:
  • 我遇到了让情节本身透明的方法,但是我如何让背景透明呢?没有Qt有办法做到这一点吗?我希望情节在背景窗口上,例如,假设我正在运行Chrome,我希望情节在chrome窗口上,其内容可见。

  • 问题内容: 使JTable背景透明不是那么容易。我只想查看单元格的文本内容。 问题答案: 如果表本身或单元格都不透明,则该表将是透明的: 如果表格位于中,则也将使其透明: 至少,您可以删除网格线: 一个简单的结果是一件很大的工作…

  • 通过使用启用透明背景功能,可以使用自定义图片作为背景。 controller.setTransparentBackground( true );

  • 这种渐变透明背景是如何实现的哦 linear-gradient试过了但与预期效果大相径庭

  • 最近,我在Android系统上实现了基于网络的应用程序。我想让webview的背景颜色透明。 搜索时,我发现Webview有两行代码。 它适用于Android版本4.0~4.3,但不适用于4.4 KITKAT。 我只有白色背景。另外,当我设置背景色黑色时,如下所示: 我还看到了白色的背景。有人知道解决办法吗?

  • 问题内容: 我正在使用CSS attrubutes: 不透明度:.9; 使DIV透明,但是当我在该DIV中添加另一个DIV时,它也使其透明。 我想使外部(背景)DIV仅透明。怎么样 ? 问题答案: 内部DIV无法撤消外部DIV的不透明度属性。如果要实现透明度,请使用或: 外层div: 内部div: 编辑 因为您已经添加了问题,所以我假设您还想要IE(旧版本)的有效解决方案。这应该可以工作(IE的最