Python 如何添加具有分类特征的辅助x轴?
在对这个问题做了一些研究之后,我找不到这个问题的答案。我想制作一个二次x轴,但是分类变量会在间隔内重复(但不会在绘图中反复重复相同的值)。在这张图片(用excel制作)中可以看到我想要的类似示例: 数据:Python 如何添加具有分类特征的辅助x轴?,python,matplotlib,plot,seaborn,axis,Python,Matplotlib,Plot,Seaborn,Axis,在对这个问题做了一些研究之后,我找不到这个问题的答案。我想制作一个二次x轴,但是分类变量会在间隔内重复(但不会在绘图中反复重复相同的值)。在这张图片(用excel制作)中可以看到我想要的类似示例: 数据: import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data1 = {'Month': list(range(11,35))+list(range(34,4
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data1 = {'Month': list(range(11,35))+list(range(34,42)),
'Checkpoint': ['A','A','A','A','A','A','B','B','B','B','B','B','C','C','C','C','C','C','C','C','C','C','C','D','C','D','D','D','D','D','D','D'],
'Litres':[216545.67,18034.45,25807.83,46136.23,68099.21,55436.35,56412.33,9347.52,3177.29,103.89,333.29,2355.41,
49063.72,113622.80,243639.97,303992.32,255471.55,267022.75,274952.92,619665.39,798969.54,1127476.60,
1563344.98,1051827.75,603167.32,1880605.49,1931002.19,
2970500.68,2362336.66,5311058.83,5071784.10,5325575.47]}
df = pd.DataFrame(data1)
通过运行上面的代码,我们获得以下数据帧
Month Checkpoint Litres
0 11 A 216545.67
1 12 A 18034.45
2 13 A 25807.83
3 14 A 46136.23
4 15 A 68099.21
5 16 A 55436.35
6 17 B 56412.33
7 18 B 9347.52
8 19 B 3177.29
9 20 B 103.89
10 21 B 333.29
11 22 B 2355.41
12 23 C 49063.72
13 24 C 113622.80
14 25 C 243639.97
15 26 C 303992.32
16 27 C 255471.55
17 28 C 267022.75
18 29 C 274952.92
19 30 C 619665.39
20 31 C 798969.54
21 32 C 1127476.60
22 33 C 1563344.98
23 34 D 1051827.75
24 34 C 603167.32
25 35 D 1880605.49
26 36 D 1931002.19
27 37 D 2970500.68
28 38 D 2362336.66
29 39 D 5311058.83
30 40 D 5071784.10
31 41 D 5325575.47
我想对数据进行散点图(可以使用matplotlib或seaborn),但要使用第二个x轴(df[‘Checkpoint’])
一种可能是使用主刻度来放置月份标签,使用次刻度来进行分隔。每当检查点标签更改时,需要绘制更长的勾号。检查点标签位置正好在两个长刻度之间 似乎有一个月有两个不同的标签(第34个月)。现在还不清楚接下来会发生什么。在下面的代码中,画了一个长的主记号
将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将matplotlib.ticker导入为ticker
数据1={'Month':列表(范围(11,35))+列表(范围(34,42)),
‘检查点’:[‘A’、‘A’、‘A’、‘A’、‘A’、‘B’、‘B’、‘B’、‘C’、‘C’、‘C’、‘C’,
“C”、“C”、“C”、“C”、“D”、“C”、“D”、“D”、“D”、“D”、“D”、“D”、“D”、“D”、“D”],
“升”:[216545.6718034.4525807.8346136.2368099.2155436.3556412.339347.523177.29103.89,
333.29, 2355.41, 49063.72, 113622.80, 243639.97, 303992.32, 255471.55, 267022.75, 274952.92,
619665.39, 798969.54, 1127476.60, 1563344.98, 1051827.75, 603167.32, 1880605.49, 1931002.19,
2970500.68, 2362336.66, 5311058.83, 5071784.10, 5325575.47]}
df=pd.DataFrame(data1)
图,ax=plt.子批次(图尺寸=(10,5))
最大散射(df['Month',df['lills',s=30,color='crimson')
ax.xaxis.set\u major\u定位器(股票代码固定定位器(0.5))
ax.xaxis.set\u major\u定位器(股票代码多路传输器(1))
ax.xaxis.set_minor_定位器(股票代码多路传输器(0.5))
ax.set_xlim(df['Month'].iloc[0]-0.5,df['Month'].iloc[-1]+0.5)
检查点=列表(df['Checkpoint'])
long_minor_ticks=[df['Month'].iloc[0]-1]#这些minor ticks需要更长
long_major_ticks=[]#这些主要ticks需要更长
对于邮政编码中的m1、m、c1、c(df['Month'][1:],df['Month'],df['Checkpoint'][1:],df['Checkpoint']):
如果m==m1:
长的主刻度。附加(m)
以利夫c!=c1:
长_小_记号。追加(m)
long\u minor\u ticks.append(df['Month'].iloc[-1])
ax.tick_参数(其中,='minor',axis='x',pad=20)#将次刻度标签放置在一定距离处
检查点标签=[]
对于tick,zip中的月份(ax.xaxis.get_minor_ticks(),范围(df['month'].iloc[0]-1100)):
l=35,如果长细节拍为月份,长大节拍为非月份,长大节拍为非月份+1,则为18
勾选。勾选1行。设置标记大小(l)
检查点标签。附加(“”)
对于tick,zip中的月份(ax.xaxis.get_major_ticks(),范围(df['month'].iloc[0]-1100)):
l=35,如果长时间内的月数大于或等于0
勾选。勾选1行。设置标记大小(l)
#在长次刻度之间的位置设置检查点字母
对于t0,t1在zip中(长细节拍[:-1],长细节拍[1:]):
如果t1!=t0+1:
ind=(t1+t0)//2-长/小刻度[0]
检查点标签[ind]=df['checkpoint'].iloc[ind]
ax.set_xticklabel(检查点标签,次要=真)
图子地块调整(底部=0.15)#我们需要空间来显示大刻度
plt.show()
嗨,约翰,非常感谢你的回答,感谢你抽出时间来帮助我。我现在将在我的数据集上测试它,然后回来告诉您它是否适用于我在数据集上遇到的许多情况。再一次,谢谢!嗨,Johan,当我在我的代码中绘制你的代码时,我只会在数字33(而不是34)中弹出一个长勾号,而在其他的代码中不会显示。我找不到这个问题。我用的是jupyterHi。因为我是在工作中这样做的,所以在安装最新的matplotlib版本时遇到了一些问题,但现在matplotlib 3.2.0已经启动。抱歉耽搁了。当运行代码时,我得到以下图像:出现的记号实际上应该是34,而不是33。我正在测试代码的每一行,当我运行这一行时,似乎所有记号都消失了:
ax.tick_params(which='minor',axis='x',pad=20)#将小记号标签放在一定距离处
,尽管没有它,A B C标签会在数字上弹出。应该在34上的标签仍然在33JohanC上,我已经逐行运行了代码,并且我确定'pad=20'参数可能是问题所在,一旦声明,长的主刻度将消失,只有33个仍然存在。我已经修复了33中出现的34个标签,我刚刚在这行中添加了“-1”,用于zip中的tick,month(ax.xaxis.get_major_ticks(),range(df['month'].iloc[0]-1100)):
plt.figure(figsize = (14,7))
plt.scatter(df['Month'], df['Litres'], s=30)