用python画尺子;对数坐标尺绘制;matplotlib坐标轴多重刻度

提供一个思路那就是 用 twiny方法,把多个x轴放在一起,就可以实现多重刻度

效果图如下:用matplotlib画了一个对数尺子;-) 某种意义上而言是x轴的三重刻度了。

用我的源码改一改可以画任意的尺子(话说也没有多少人有画尺子的需求吧),或者有画多重刻度图表需求的小伙伴们可以参考一下,

源码写得很乱,大家凑合看,看不懂在下面评论问我,随缘解答。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FixedLocator
import pandas as pd

# 指定 Excel 文件的路径
file_path = '对数尺表.xlsx'

# 使用 read_excel 函数读取数据
data = pd.read_excel(file_path,dtype=np.float32)

# 显示数据的前几行
distance  = data['假值(尺子上的distance)'].values

# 创建数据
x1 = np.linspace(0, 10, 100)
y = x1-x1

# 创建图形和主Axes
fig, ax1 = plt.subplots(figsize=(20, 1))

# 主X轴
ax1.plot(x1, y,linewidth=0)
  
# 创建第二个X轴
ax2 = ax1.twiny()  # 创建与ax1共享Y轴的新Axes
x2 = x1  # 为了演示,我们用2倍的x1
ax2.plot(x2, y,linewidth=0 )
 
# 创建第三个X轴
ax3 = ax1.twiny()  # 创建与ax1共享Y轴的新Axes
x3 = x1  # 为了演示,我们用0.5倍的x1
ax3.plot(x3, y,linewidth=0 )

ax4 = ax1.twiny()  # 创建与ax1共享Y轴的新Axes
x4 = x1  # 为了演示,我们用0.5倍的x1
ax4.plot(x4, y,linewidth=0 )

# 设置X轴的位置
ax1.xaxis.tick_bottom()  # 显示主X轴的刻度
ax2.xaxis.tick_bottom()  # 显示第二个X轴的刻度
ax3.xaxis.tick_bottom()  # 显示第三个X轴的刻度
ax4.xaxis.tick_bottom()

major_tick_locations = distance*10
major_locator = FixedLocator(major_tick_locations)
ax1.xaxis.set_major_locator(major_locator)
# ax1.set_xticks(major_tick_locations,labels1)
ax1.tick_params(which='both', length=12, width=0.4, color='black', direction='in')
ax1.set_xticklabels([])


# [1,2,3,4,5,6,7,8,9,10]
index2 = data['真值(尺子上的刻度)'].isin([1,2,3,4,5,6,7,8,9,10])
distance2 = data['假值(尺子上的distance)'].values[index2]
labels2 = ['1','2','3','4','5','6','7','8','9','10']
major_tick_locations2 = distance2*10
major_locator2 = FixedLocator(major_tick_locations2)
ax2.xaxis.set_major_locator(major_locator2)
ax2.set_xticks(major_tick_locations2,labels2)
ax2.tick_params(which='both', length=20, width=0.6, color='black', direction='in',
                pad=-32,labelsize=14)


distanceNumner = np.array([1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,
                           2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,]
    ,dtype=np.float32)
index3 = data['真值(尺子上的刻度)'].isin(distanceNumner)
distance3 = data['假值(尺子上的distance)'].values[index3]
labels3 =  [dis[-1] for dis in distanceNumner.astype(str)  ]
major_tick_locations3 =distance3*10
major_locator3 = FixedLocator(major_tick_locations3)
ax3.xaxis.set_major_locator(major_locator3)
ax3.set_xticks(major_tick_locations3,labels3)
ax3.tick_params(which='both', length=15, width=0.6, color='black', direction='in',pad=-22)
# 设置图例



distanceNumner4 = np.array([1.05,1.15,1.25,1.35,
                            2.1,2.2,2.3,2.4,2.6,2.7,2.8,2.9,
                            3.1,3.2,3.3,3.4,3.6,3.7,3.8,3.9,
                            4.1,4.2,4.3,4.4,4.6,4.7,4.8,4.9,]
                           ,dtype=np.float32)

index4 = data['真值(尺子上的刻度)'].isin(distanceNumner4)
distance4 = data['假值(尺子上的distance)'].values[index4]
major_tick_locations4 =distance4*10
major_locator4 = FixedLocator(major_tick_locations4)
ax4.xaxis.set_major_locator(major_locator4)
ax4.tick_params(which='both', length=15, width=0.6, color='black', direction='in')
ax4.set_xticklabels([])



ax1.set_yticklabels([])
ax1.spines['top'].set_visible(False)


ax1.spines['bottom'].set_visible(False)
ax2.spines['bottom'].set_visible(False)
ax3.spines['bottom'].set_visible(False)
ax4.spines['bottom'].set_visible(False)


ax1.set_yticks([])
ax1.set_yticklabels([])

# 隐藏 轴线条
for ax_i in [ax1,ax2,ax3,ax4]:
    for spine in ax_i.spines.values():
        spine.set_visible(False)

plt.subplots_adjust(bottom=0)


# 保存为SVG文件
plt.savefig('rular.svg', format='svg',transparent=True)

plt.imshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值