在python中的figue中间绘制轴

Sha*_*han 22 python drawing matplotlib

我想在matplotib中绘制一个图形,其中轴在图中显示而不是在侧面

我曾尝试下面的代码

import math
import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    a = []
    for item in x:
        a.append(1/(1+math.exp(-item)))
    return a

x = np.arange(-10., 10., 0.2)
sig = sigmoid(x)

plt.plot(x,sig)
plt.show()
Run Code Online (Sandbox Code Playgroud)

上面的代码显示了这样的图 在此输入图像描述

我想画的是如下(图片来自维基)

在此输入图像描述

看着这个问题,它在中间绘制了一条参考线但没有轴.

任何帮助都会很棒!

谢谢

Jbl*_*sco 24

一种方法是使用:

import math
import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    a = []
    for item in x:
        a.append(1/(1+math.exp(-item)))
    return a


x = np.arange(-10., 10., 0.2)
sig = sigmoid(x)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# Move left y-axis and bottim x-axis to centre, passing through (0,0)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('center')

# Eliminate upper and right axes
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# Show ticks in the left and lower axes only
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

plt.plot(x,sig)
plt.show()
Run Code Online (Sandbox Code Playgroud)

说明: 在此输入图像描述

  • 最好使用“零”特殊位置而不是“中心”。事实上,在前者中,如果您的绘图与 x 轴不对称,您的轴将不会通过原点,而只会到达绘图的中心。例如,尝试使用此设置绘制 ELU 函数。 (2认同)

小智 17

基本上,我想评论接受的答案(但我的代表不允许这样做).指某东西的用途

ax.spines['bottom'].set_position('center')
Run Code Online (Sandbox Code Playgroud)

绘制x轴,使其与中心的y轴相交.在非对称ylim的情况下,这意味着x轴不通过y = 0.Jblasco的答案有这个缺点,相交在y = 0.5(ymin = 0.0和ymax = 1.0之间的中心)但是,原始问题的参考图具有彼此相交的轴为0.0(这在某种程度上是常规的或至少是共同).为了实现这种行为,

ax.spines['bottom'].set_position('zero')
Run Code Online (Sandbox Code Playgroud)

必须使用.请参阅以下示例,其中"零"使轴相交为0.0,尽管x和y都有不对称的范围.

import numpy as np
import matplotlib.pyplot as plt

#data generation
x = np.arange(-10,20,0.2)
y = 1.0/(1.0+np.exp(-x)) # nunpy does the calculation elementwise for you


fig, [ax0, ax1] = plt.subplots(ncols=2, figsize=(8,4))

# Eliminate upper and right axes
ax0.spines['top'].set_visible(False)
ax0.spines['right'].set_visible(False)
# Show ticks on the left and lower axes only
ax0.xaxis.set_tick_params(bottom='on', top='off')
ax0.yaxis.set_tick_params(left='on', right='off')

# Move remaining spines to the center
ax0.set_title('center')
ax0.spines['bottom'].set_position('center') # spine for xaxis 
#    - will pass through the center of the y-values (which is 0)
ax0.spines['left'].set_position('center')  # spine for yaxis 
#    - will pass through the center of the x-values (which is 5)

ax0.plot(x,y)


# Eliminate upper and right axes
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)
# Show ticks on the left and lower axes only (and let them protrude in both directions)
ax1.xaxis.set_tick_params(bottom='on', top='off', direction='inout')
ax1.yaxis.set_tick_params(left='on', right='off', direction='inout')

# Make spines pass through zero of the other axis
ax1.set_title('zero')
ax1.spines['bottom'].set_position('zero')
ax1.spines['left'].set_position('zero')

ax1.set_ylim(-0.4,1.0)

# No ticklabels at zero
ax1.set_xticks([-10,-5,5,10,15,20])
ax1.set_yticks([-0.4,-0.2,0.2,0.4,0.6,0.8,1.0])

ax1.plot(x,y)

plt.show() 
Run Code Online (Sandbox Code Playgroud)

最后注释:如果ax.spines['bottom'].set_position('zero')使用但是零不在绘制的y范围内,那么轴将在曲线的边界处显示为接近零.


Cod*_*ife 13

这个问题的标题是如何在中间绘制脊柱,并且接受的答案正是如此,但是你们绘制的是sigmoid函数,并且通过y = 0.5.所以我认为你想要的是根据你的数据集中的脊柱.Matplotlib提供脊柱位置数据(参见文档)

import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
sigmoid = np.vectorize(sigmoid) #vectorize function
values=np.linspace(-10, 10) #generate values between -10 and 10
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

#spine placement data centered
ax.spines['left'].set_position(('data', 0.0))
ax.spines['bottom'].set_position(('data', 0.0))
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

plt.plot(values, sigmoid(values))
plt.show()
Run Code Online (Sandbox Code Playgroud)

看起来像这样(Github):

在此输入图像描述

  • 这很酷。您如何摆脱重复的零标签? (2认同)

roi*_*363 5

你可以简单地添加

plt.axhline()
plt.axvline()
Run Code Online (Sandbox Code Playgroud)

工作示例:

import matplotlib.pyplot as plt
import numpy as np

def f(x):
    return np.sin(x) / (x/100)

delte = 100
Xs = np.arange(-delte, +delte +1, step=0.01)
Ys = np.array([f(x) for x in Xs])
plt.axhline(color='black', lw=0.5)
plt.axvline(color='black', lw=0.5)
plt.plot(Xs, Ys)
plt.show()
Run Code Online (Sandbox Code Playgroud)

图形