y轴小刻度的bug
在y轴上,次刻度线的位置不太对。我把次刻度的设置定为2,这样每两个主刻度之间应该有一个次刻度,但我发现y轴底部有刻度线,而中间和顶部却没有。
这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import (AutoMinorLocator)
from matplotlib.pyplot import figure
minor_locator = AutoMinorLocator(n=2)
#a je 2-->1
a_1_2 = np.array([0,12.3787177960363,0,12.3787177960363,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,0,0,18.5680766940545,0,18.5680766940545])
a_1_2[a_1_2==0] = np.nan
#b je 1-->2
b_1_2 = np.array([12.3787177960363,0,12.3787177960363,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,18.5680766940545,0,0,0,18.5680766940545,0])
b_1_2[b_1_2==0] = np.nan
#c je 2-->3
c = np.array([0,0,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.5680766940545,0,0,0,0])
c[c==0] = np.nan
#d je 3-->2
d = np.array([0,0,0,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.5680766940545,0,0,0])
d[d==0] = np.nan
vykon_1_2 = np.array([70,37,68,33,62,131,125,21,58,118,114,19,64,21,60,21,90,78,80,71,74,71,70,70,82,54,75,44,68,61,70,129,123,56,71,53])
a_1_04 = np.array([0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,0,0,8.24027072221352,16.480541444427,0,0,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577])
a_1_04[a_1_04==0] = np.nan
b_1_04 = np.array([16.480541444427,0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,8.24027072221352,0,0,16.480541444427,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577,0])
b_1_04[b_1_04==0] = np.nan
vykon_1_04 = np.array([80,44,65,44,67,36,78,36,79,60,79,61,80,99,90,54,70,85,39,85,39,72,67,102,48,128,127])
a_0_8 = np.array([0,27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953])
a_0_8[a_0_8==0] = np.nan
b_0_8 = np.array([27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953,0])
b_0_8[b_0_8==0] = np.nan
vykon_0_8 = np.array([105,100,101,97,97,95,98,94])
R_a_1_2 = 1.78*a_1_2*1.2e-3/(5.04e-5)
R_b_1_2 = 1.78*b_1_2*1.2e-3/(5.04e-5)
R_a_1_04 = 1.78*a_1_04*1.04e-3/(5.04e-5)
R_b_1_04 = 1.78*b_1_04*1.04e-3/(5.04e-5)
R_a_0_8 = 1.78*a_0_8*0.8e-3/(5.04e-5)
R_b_0_8 = 1.78*b_0_8*0.8e-3/(5.04e-5)
a_1_2 = pd.DataFrame(a_1_2)
b_1_2 = pd.DataFrame(b_1_2)
c = pd.DataFrame(c)
d = pd.DataFrame(d)
R_a_1_2 = pd.DataFrame(R_a_1_2)
R_b_1_2 = pd.DataFrame(R_b_1_2)
vykon_1_2 = pd.DataFrame(vykon_1_2)
a_1_04 = pd.DataFrame(a_1_04)
b_1_04 = pd.DataFrame(b_1_04)
R_a_1_04 = pd.DataFrame(R_a_1_04)
R_b_1_04 = pd.DataFrame(R_b_1_04)
vykon_1_04 = pd.DataFrame(vykon_1_04)
a_0_8 = pd.DataFrame(a_0_8)
b_0_8 = pd.DataFrame(b_0_8)
R_a_0_8 = pd.DataFrame(R_a_0_8)
R_b_0_8 = pd.DataFrame(R_b_0_8)
vykon_0_8 = pd.DataFrame(vykon_0_8)
data_1_2 = pd.concat([vykon_1_2, a_1_2,b_1_2,c,d], axis = 1)
data_1_04 = pd.concat([vykon_1_04, a_1_04,b_1_04], axis = 1)
data_0_8 = pd.concat([vykon_0_8, a_0_8,b_0_8], axis = 1)
data_R_1_2 = pd.concat([vykon_1_2, R_a_1_2,R_b_1_2,], axis = 1)
data_R_1_04 = pd.concat([vykon_1_04, R_a_1_04,R_b_1_04], axis = 1)
data_R_0_8 = pd.concat([vykon_0_8, R_a_0_8,R_b_0_8], axis = 1)
fig, ax = plt.subplots(figsize=(8,5), dpi = 100)
#figure(figsize=(8,5), dpi = 100)
#plt.plot(data.iloc[:,0],data.iloc[:,1],"v", color="#000000")
plt.ylabel('Výkon [W]')
plt.xlabel('Rychlost plynu [m/s]')
ax.plot(data_1_2.iloc[:,2],data_1_2.iloc[:,0],"v", color="#000000", label = "1,2 mm průměr")
ax.plot(data_1_04.iloc[:,2],data_1_04.iloc[:,0],"s", color="#ff0000", label = "1,04 mm průměr")
ax.plot(data_0_8.iloc[:,2],data_0_8.iloc[:,0],"o", color="#0000ff", label = "0,8 mm průměr")
ax.legend()
#plt.plot(data_1_2.iloc[:,2],data_1_2.iloc[:,0])
#plt.plot(data_1_2.iloc[:,3],data_1_2.iloc[:,0])
#plt.xlim(10, 140)
plt.yticks(np.arange(10,130+1, step=20))
ax.yaxis.set_minor_locator(minor_locator)
plt.xticks(np.arange(5, 35+1, step=2.5))
ax.xaxis.set_minor_locator(minor_locator)
plt.savefig("prechod_z_1_na_2.pdf")
#ax.xaxis.set_major_locator(MultipleLocator(20))
#ax.xaxis.set_minor_locator(MultipleLocator(5))
这是我得到的结果:
2 个回答
0
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import AutoMinorLocator
minor_locator = AutoMinorLocator(n=2)
# your data
fig, ax = plt.subplots(figsize=(8,5), dpi=100)
plt.ylabel('Výkon [W]')
plt.xlabel('Rychlost plynu [m/s]')
ax.plot(data_1_2.iloc[:,2], data_1_2.iloc[:,0], "v", color="#000000", label="1,2 mm průměr")
ax.plot(data_1_04.iloc[:,2], data_1_04.iloc[:,0], "s", color="#ff0000", label="1,04 mm průměr")
ax.plot(data_0_8.iloc[:,2], data_0_8.iloc[:,0], "o", color="#0000ff", label="0,8 mm průměr")
ax.legend()
plt.yticks(np.arange(10, 130+1, step=20))
plt.xticks(np.arange(5, 35+1, step=2.5))
# minor tick placement on y-axis is adjusted here
ax.yaxis.set_minor_locator(minor_locator)
minor_ticks_y = np.arange(15, 130, 20) # Define minor tick positions manually
ax.set_yticks(minor_ticks_y, minor=True)
plt.savefig("prechod_z_1_na_2.pdf")
plt.show()
在这段代码中,minor_ticks_y 被定义为一个数组,这个数组里存放的是我们希望在 y 轴上放置小刻度的位置。你可以根据需要来调整这个数组里的位置。接着,使用 ax.set_yticks() 来设置这些刻度,并指定 minor=True,表示这些是小刻度。你可以按照自己的想法来调整 minor_ticks_y 数组里的位置。
1
简而言之,记得使用 ax.*axis.set_minor_locator(AutoMinorLocator(n))
。
如果你用同一个 AutoMinorLocator
实例两次,就会出问题。
我猜测是这样的:
- 当一个
AutoMinorLocator
被绑定到一个坐标轴上时,它内部会记录一个刻度位置的列表。 - 如果你把同一个实例作为
minor_locator
绑定到两个坐标轴上,内部数据只会对最后一个坐标轴是正确的,因为之前的数据会被覆盖。 - 当你使用
plt.show()
时,只有一个坐标轴会关联到正确的数据结构(就是最后一个绑定的那个),而第一个坐标轴的刻度会根据第二个坐标轴的刻度位置来放置。
下面是一个例子。
在第一个子图中,先把同一个实例用在 x 轴上,然后用在 y 轴上,y 轴的刻度是正确的,但 x 轴的刻度却在 16.67 和 23.33,也就是和 y 轴的两个位置一样!
在第二个子图中,先用在 y 轴上,然后用在 x 轴上,x 轴的刻度是正确的,但 y 轴的刻度和 x 轴的刻度在同样的位置,最后一个 y 轴的刻度大约在 35。
在第三个子图中,使用两个不同的新实例,这样两个坐标轴的刻度都是正确的。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
#Number of Minor Ticks
nmt = 3
b_1_2 = np.array([12.3787177960363,0,12.3787177960363,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,18.5680766940545,0,0,0,18.5680766940545,0])
b_1_04 = np.array([16.480541444427,0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,8.24027072221352,0,0,16.480541444427,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577,0])
b_0_8 = np.array([27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953,0])
vykon_1_2 = np.array([70,37,68,33,62,131,125,21,58,118,114,19,64,21,60,21,90,78,80,71,74,71,70,70,82,54,75,44,68,61,70,129,123,56,71,53])
vykon_1_04 = np.array([80,44,65,44,67,36,78,36,79,60,79,61,80,99,90,54,70,85,39,85,39,72,67,102,48,128,127])
vykon_0_8 = np.array([105,100,101,97,97,95,98,94])
for v in (b_1_2, b_1_04, b_0_8): v[v==0] = np.nan
fig, axes = plt.subplots(3, 1, figsize=(7, 10), layout='constrained')
for n, ax in enumerate(axes.flat):
ax.plot( b_1_2, vykon_1_2, "v", color="#000000", label = "1,20 mm průměr")
ax.plot(b_1_04, vykon_1_04, "s", color="#ff0000", label = "1,04 mm průměr")
ax.plot (b_0_8, vykon_0_8, "o", color="#0000ff", label = "0,80 mm průměr")
ax.set_xticks(np.arange(5, 35+1, step=2.5))
ax.set_yticks(np.arange(10,130+1, step=20))
minor_locator = AutoMinorLocator(nmt)
if n==0:
ax.xaxis.set_minor_locator(minor_locator)
ax.yaxis.set_minor_locator(minor_locator)
elif n==1:
ax.yaxis.set_minor_locator(minor_locator)
ax.xaxis.set_minor_locator(minor_locator)
else:
ax.xaxis.set_minor_locator(AutoMinorLocator(nmt))
ax.yaxis.set_minor_locator(AutoMinorLocator(nmt))
ax.set_xlabel('Rychlost plynu [m/s]')
ax.set_ylabel('Výkon [W]')
ax.legend()
plt.show()