Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一个数据帧绘制多条线,并添加一个次轴以绘制不同的数据帧-坐标轴_Python_Pandas_Matplotlib_Scatter Plot_Multiple Axes - Fatal编程技术网

Python 从一个数据帧绘制多条线,并添加一个次轴以绘制不同的数据帧-坐标轴

Python 从一个数据帧绘制多条线,并添加一个次轴以绘制不同的数据帧-坐标轴,python,pandas,matplotlib,scatter-plot,multiple-axes,Python,Pandas,Matplotlib,Scatter Plot,Multiple Axes,我对matplotlib有意见。我想用两个y轴做一个散点图,这两个轴应该对应两个不同的数据帧。但我遇到的问题是从一个数据帧绘制多行 第一个数据帧(IV_dv): 第二个数据帧(rainavg): 我想绘制一个散点图,左y轴为PM2.5浓度(ug/m3),这是列EC_pmdv、C_pmdv和B_pmdv所描述的。我希望右y轴为(mm)。我希望x轴是一年。我无法从IVdv绘制所有三条线(我要绘制x1=IVdv.year,y1=IVdv.EC_pmdv,x2=IVdv.year,y2=IVdv.C_p

我对matplotlib有意见。我想用两个y轴做一个散点图,这两个轴应该对应两个不同的数据帧。但我遇到的问题是从一个数据帧绘制多行

第一个数据帧(IV_dv):

第二个数据帧(rainavg):

我想绘制一个散点图,左y轴为PM2.5浓度(ug/m3),这是列EC_pmdv、C_pmdv和B_pmdv所描述的。我希望右y轴为(mm)。我希望x轴是一年。我无法从IVdv绘制所有三条线(我要绘制x1=IVdv.year,y1=IVdv.EC_pmdv,x2=IVdv.year,y2=IVdv.C_pmdv,x3=IVdv.year,y3=IVdv.B_pmdv)。我知道怎么做两个y轴。我已经附上了迄今为止我编写的代码:

fig, ax = plt.subplots()
ax.plot(x1=IVdv.index, y1=IVdv.EC_pmdv, x2=IVdv.index, y2=IVdv.C_pmdv, x3=IVdv.index,
        y3=IVdv.B_pmdv, color='k', linewidth=2.0, label1='El Centro',
        label2='Calexico', label3='Brawley', marker='v') 
ax.set_xticks(IVdv.index)
ax.title.set_text('PM2.5 Design Values')
ax.set_ylim(0,100)
ax.set_ylabel('PM2.5 Design Value (ug/m3)')
ax.set_xlabel('Year')

ax2=ax.twinx()
ax2.plot(rainavg.year, rainavg.precip, color='c', 
        linewidth=2.0, label='Imperial County annual precipitation', marker='o')
ax2.set_ylim(25,170)
ax2.set_xticks(rainavg.year)
ax2.set_ylabel('Annual Precipitation Average (mm)')
lines_1, labels_1 = ax.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()

lines = lines_1 + lines_2
labels = labels_1 + labels_2

ax.legend(lines, labels, loc='upper center')
然而,它只是绘制降雨数据。我不认为这是正确的语法,但我似乎找不到任何东西来回答我的问题。我只找到解释如何从一个数据帧绘制多条线或如何绘制两个y轴的论坛


这个链接说我需要使用ax=ax,但我不确定如何格式化它,同时保留我的第二个y轴。

让我们使用pandas绘图,它更容易:

fig, ax = plt.subplots(figsize=(10,8))
IVdv.plot(ax = ax, marker='v')
ax.title.set_text('PM2.5 Design Values')
ax.set_ylim(0,100)
ax.set_ylabel('PM2.5 Design Value (ug/m3)')
ax.set_xlabel('Year')
ax.set_xticks(IVdv.index)

ax2=ax.twinx()
ax2.plot(rainavg.year, rainavg.precip, color='c', 
        linewidth=2.0, label='Imperial County annual precipitation', marker='o')
ax2.set_ylim(25,170)
# ax2.set_xticks(rainavg.year)
ax2.set_ylabel('Annual Precipitation Average (mm)')
lines_1, labels_1 = ax.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()

lines = lines_1 + lines_2
labels = labels_1 + labels_2

ax.legend(lines, labels, loc='upper center')
输出:

更新多个标记样式且无行:

fig, ax = plt.subplots(figsize=(10,8))
markerstyles = ['v','o','+','*','.']
for i, col in zip(markerstyles, IVdv):
    IVdv[col].plot(ax = ax, marker=i, linestyle='none')
    
ax.title.set_text('PM2.5 Design Values')
ax.set_ylim(0,100)
ax.set_ylabel('PM2.5 Design Value (ug/m3)')
ax.set_xlabel('Year')
ax.set_xticks(IVdv.index)

ax2=ax.twinx()
ax2.plot(rainavg.year, rainavg.precip, color='c', 
        linewidth=2.0, label='Imperial County annual precipitation', marker='o')
ax2.set_ylim(25,170)
# ax2.set_xticks(rainavg.year)
ax2.set_ylabel('Annual Precipitation Average (mm)')
lines_1, labels_1 = ax.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()

lines = lines_1 + lines_2
labels = labels_1 + labels_2

ax.legend(lines, labels, loc='upper center')
输出:


让我们使用熊猫图,它更容易:

fig, ax = plt.subplots(figsize=(10,8))
IVdv.plot(ax = ax, marker='v')
ax.title.set_text('PM2.5 Design Values')
ax.set_ylim(0,100)
ax.set_ylabel('PM2.5 Design Value (ug/m3)')
ax.set_xlabel('Year')
ax.set_xticks(IVdv.index)

ax2=ax.twinx()
ax2.plot(rainavg.year, rainavg.precip, color='c', 
        linewidth=2.0, label='Imperial County annual precipitation', marker='o')
ax2.set_ylim(25,170)
# ax2.set_xticks(rainavg.year)
ax2.set_ylabel('Annual Precipitation Average (mm)')
lines_1, labels_1 = ax.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()

lines = lines_1 + lines_2
labels = labels_1 + labels_2

ax.legend(lines, labels, loc='upper center')
输出:

更新多个标记样式且无行:

fig, ax = plt.subplots(figsize=(10,8))
markerstyles = ['v','o','+','*','.']
for i, col in zip(markerstyles, IVdv):
    IVdv[col].plot(ax = ax, marker=i, linestyle='none')
    
ax.title.set_text('PM2.5 Design Values')
ax.set_ylim(0,100)
ax.set_ylabel('PM2.5 Design Value (ug/m3)')
ax.set_xlabel('Year')
ax.set_xticks(IVdv.index)

ax2=ax.twinx()
ax2.plot(rainavg.year, rainavg.precip, color='c', 
        linewidth=2.0, label='Imperial County annual precipitation', marker='o')
ax2.set_ylim(25,170)
# ax2.set_xticks(rainavg.year)
ax2.set_ylabel('Annual Precipitation Average (mm)')
lines_1, labels_1 = ax.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()

lines = lines_1 + lines_2
labels = labels_1 + labels_2

ax.legend(lines, labels, loc='upper center')
输出:


跟进:我需要有不同的标记,每个设计值都没有行,我认为现在编写代码的方式不可能做到这一点。我知道了如何使用
linestyle='None'
删除行,但不确定如何创建单独的标记。接下来:我需要为每个设计值创建不同的标记,并且没有行,我认为现在编写代码的方式不可能做到这一点。我知道如何使用
linestyle='None'
删除这些行,但不知道如何创建单独的标记。