Python 如何添加具有分类特征的辅助x轴?

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

在对这个问题做了一些研究之后,我找不到这个问题的答案。我想制作一个二次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,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)