pandas 熊猫在 x 轴上绘制 xticks

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31332264/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 23:36:29  来源:igfitidea点击:

pandas plot xticks on x-axis

pythonpandasmatplotlibplotdataframe

提问by jxn

I have a working code that displays a panda dataframe as 2 line graphs in a chart. I also have a dataframe that displays a bar graph on the same chart. For the 2 dataframes, i have date for the x-axis. Because the two dataframes have dates, my axis end up just having integers (1,2,3,4,5,6...) instead of the date.

我有一个工作代码,它将Pandas数据框显示为图表中的 2 个折线图。我还有一个数据框,它在同一图表上显示条形图。对于 2 个数据框,我有 x 轴的日期。因为两个数据框都有日期,所以我的轴最终只有整数(1,2,3,4,5,6...)而不是日期。

I thought this line df1 = df.set_index(['date'])specifies what i want as the x-axis already and when i dont plot the bar graph on the chart, the dates show up nicely, but when i do plot the bar graph, the integers show up on the axis instead.

我认为这条线已经df1 = df.set_index(['date'])指定了我想要的 x 轴,当我不在图表上绘制条形图时,日期显示得很好,但是当我绘制条形图时,整数反而显示在轴上。

My 2 dataframes:

我的 2 个数据框:

df1:
date      line1  line2
2015-01-01 15.00  23.00
2015-02-01 18.00  10.00

df2:
date      quant  
2015-01-01 500 
2015-02-01 600

My code:

我的代码:

df1 =pd.DataFrame(result, columns =[ 'date','line1', 'line2']) 
df1 = df.set_index(['date'])

df2 =pd.DataFrame(quantity, columns =[ 'quant','date']) 
fig = plt.figure()
ax = fig.add_subplot(111)
ax2=ax.twinx()
ax.set_ylim(0,100)
ax2.set_ylim(0,2100)

df1.line1.plot( color = 'red', ax = ax)
df1.line2.plot( color = 'blue', ax = ax)
df2.["quant"].plot(kind = 'bar', ax =ax2, width =0.4)
plt.show()


enter image description here

在此处输入图片说明

df1:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 12 entries, 0 to 11
Data columns (total 3 columns):
date        12 non-null object
line1    12 non-null float64
line2     12 non-null float64
dtypes: float64(2), object(1)
memory usage: 384.0+ bytes
None

df2
<class 'pandas.core.frame.DataFrame'>
Int64Index: 11 entries, 0 to 10
Data columns (total 2 columns):
quant         11 non-null int64
date    11 non-null object
dtypes: int64(1), object(1)
memory usage: 264.0+ bytes
None

回答by Jianxun Li

You can just use ax.plot(df1.date, df1.line1)and matplotlib.pyplotwill automatically take care of the date.

您可以使用ax.plot(df1.date, df1.line1)matplotlib.pyplot自动处理日期。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# your data
# ===================================
np.random.seed(0)
df1 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), line1=np.random.randint(10, 30, 12), line2=np.random.randint(20, 25, 12)))

Out[64]: 
         date  line1  line2
0  2015-01-01     22     22
1  2015-02-01     25     21
2  2015-03-01     10     20
3  2015-04-01     13     21
4  2015-05-01     13     21
5  2015-06-01     17     20
6  2015-07-01     19     21
7  2015-08-01     29     24
8  2015-09-01     28     23
9  2015-10-01     14     20
10 2015-11-01     16     23
11 2015-12-01     22     20



df2 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), quant=100*np.random.randint(3, 10, 12)))

Out[66]: 
         date  quant
0  2015-01-01    500
1  2015-02-01    600
2  2015-03-01    300
3  2015-04-01    400
4  2015-05-01    600
5  2015-06-01    800
6  2015-07-01    600
7  2015-08-01    600
8  2015-09-01    900
9  2015-10-01    300
10 2015-11-01    400
11 2015-12-01    400

# plotting
# ===================================
fig, ax = plt.subplots(figsize=(10, 8))
ax.plot(df1.date, df1.line1, label='line1', c='r')
ax.plot(df1.date, df1.line2, label='line2', c='b')
ax2 = ax.twinx()
ax2.set_ylabel('quant')
ax2.bar(df2.date, df2.quant, width=20, alpha=0.1, color='g', label='quant')
ax.legend(loc='best')
ax.set_xticks(ax.get_xticks()[::2])

enter image description here

在此处输入图片说明

Follow-up (Updates):

跟进(更新):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# your data
# ===================================
np.random.seed(0)
df1 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), line1=np.random.randint(10, 30, 12), line2=np.random.randint(20, 25, 12))).set_index('date')
df2 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), quant=100*np.random.randint(3, 10, 12))).set_index('date')
df2 = df2.drop(df2.index[4])
print(df1)
print(df2)
            line1  line2
date                    
2015-01-01     22     22
2015-02-01     25     21
2015-03-01     10     20
2015-04-01     13     21
2015-05-01     13     21
2015-06-01     17     20
2015-07-01     19     21
2015-08-01     29     24
2015-09-01     28     23
2015-10-01     14     20
2015-11-01     16     23
2015-12-01     22     20
            quant
date             
2015-01-01    500
2015-02-01    600
2015-03-01    300
2015-04-01    400
2015-06-01    800
2015-07-01    600
2015-08-01    600
2015-09-01    900
2015-10-01    300
2015-11-01    400
2015-12-01    400

# plotting
# ===================================
fig, ax = plt.subplots(figsize=(10, 8))
ax.plot(df1.index, df1.line1, label='line1', c='r')
ax.plot(df1.index, df1.line2, label='line2', c='b')
ax2 = ax.twinx()
ax2.set_ylabel('quant')
ax2.bar(df2.index, df2.quant, width=20, alpha=0.1, color='g', label='quant')
ax.legend(loc='best')
ax.set_xticks(ax.get_xticks()[::2])

enter image description here

在此处输入图片说明