Python Matplotlib:具有不同数据长度和文本的多轴散点图

Python Matplotlib:具有不同数据长度和文本的多轴散点图,python,matplotlib,Python,Matplotlib,我正在尝试使用matplotlib创建一个图形。 在X轴上,我有体积,在895行中达到333毫升。 在Y轴上,我的吸光度在895行中达到446毫升。 X和Y数据的长度相同。 现在我想添加与分数体积ml对应的分数名称(分数)(A1、A2、A3等…)。 分数体积也达到333ml,但数据点以83行结束。 另外,我想用相同的x轴ml添加温度和压力,但请注意,它们的数据长度不同 我已经附上了原始数据和它应该是什么样子的附加图像excel文件 以及: 您的数据似乎没有电导率数据。为了标记分数,我基本上迭代分

我正在尝试使用matplotlib创建一个图形。 在X轴上,我有体积,在895行中达到333毫升。 在Y轴上,我的吸光度在895行中达到446毫升。 X和Y数据的长度相同。 现在我想添加与分数体积ml对应的分数名称(分数)(A1、A2、A3等…)。 分数体积也达到333ml,但数据点以83行结束。 另外,我想用相同的x轴ml添加温度和压力,但请注意,它们的数据长度不同

我已经附上了原始数据和它应该是什么样子的附加图像excel文件

以及:


您的数据似乎没有电导率数据。为了标记分数,我基本上迭代分数并逐个添加标签。以下是我得到的:

图为:

编辑: 以下是两个y轴的示例:

图为:


如中所述:“目前不支持两个以上的刻度,尽管它在愿望列表中。”

当我使用文件运行代码时,我得到了:python se.py Traceback(最近一次调用):plt.plot(se)name中第40行的文件“se.py”错误:name'se'不是defined@Ziprip对不起,我弄错了。将其更新为
se_abs_data
,并删除未使用的导入。你能再试一次吗?开始工作了,我现在有了图表,但问题是分数与实际图表重叠。这是输出:另外,我想将Temp和Pressure添加到同一个图表中,并用Temp和Pressure值更新了xls文件。注:温度和压力的数据点也不同。“我该怎么画呢?”Zipip很有趣。出于我不理解的原因,您的绘图上的y轴似乎被设置为大约
[-1002500]
。这会降低图形,使其与分数标签重叠。尝试在
plt.plot(se\u abs\u数据)之后添加
plt.axis([0350,-5002500])
。这会让你的图表恢复正常,远离分数标签。@Ziprip至于添加温度和压力数据,我不知道你想如何在一个只有两个y轴的图表中绘制三种类型的数据。。。我很抱歉。也许可以提出一个新问题,其他人可以提供帮助。如果需要双轴,可以尝试从修改。不可能在注释中向您显示整个新代码块。很抱歉
import pandas as pd
import matplotlib.pyplot as plt

se_abs_data = pd.read_excel('se.xls', header=0, index_col=0, parse_cols=[0, 1])
se_tube_label = pd.read_excel('se.xls', header=0, index_col=0, parse_cols=[2, 3]).dropna()

# Make a wider figure so that fraction labels are visible.
fig_size = plt.figure().get_size_inches()
fig_size[0] = fig_size[0] * 2
plt.figure(figsize=fig_size)

plt.plot(se_abs_data)

# Find y position for fraction labels
[_, _, ymin, ymax] = plt.axis()
y_tube_label = ymin + (ymax - ymin) * 0.03
# Add fraction labels one by one
for fraction, label in se_tube_label.iterrows():
    plt.text(fraction, y_tube_label, label[0], rotation='vertical', verticalalignment='bottom')
    plt.axvline(fraction, ymax=0.1, color='r')

plt.xlabel('Elution volume (ml)')
plt.ylabel('Absorbance (mAu)')
plt.minorticks_on()
plt.legend(['UV1 280nm'], frameon=False)
# plt.savefig('test.png')
plt.show()
import pandas as pd
import matplotlib.pyplot as plt

se_abs_data = pd.read_excel('se.xls', header=0, index_col=0, parse_cols=[0, 1])
se_temp_data = pd.read_excel('se.xls', header=0, index_col=0, parse_cols=[4, 5])
se_tube_label = pd.read_excel('se.xls', header=0, index_col=0, parse_cols=[2, 3]).dropna()

# Make a wider figure so that fraction labels are visible.
fig, ax_abs = plt.subplots()
fig_size = fig.get_size_inches()
fig_size[0] = fig_size[0] * 2
fig.set_size_inches(fig_size)

line_abs, = ax_abs.plot(se_abs_data, color='b')
ax_abs.axis([0, 350, -500, 2500])
ax_temp = ax_abs.twinx()
line_temp, = ax_temp.plot(se_temp_data, color='r')
ax_temp.axis([0, 350, 17.8, 19.6])

# Find y position for fraction labels
[_, _, ymin, ymax] = ax_abs.axis()
y_tube_label = ymin + (ymax - ymin) * 0.03
# Add fraction labels one by one
for fraction, label in se_tube_label.iterrows():
    ax_abs.text(fraction, y_tube_label, label[0], rotation='vertical', verticalalignment='bottom')
    ax_abs.axvline(fraction, ymax=0.1, color='r')

plt.minorticks_on()
plt.xlabel('Elution volume (ml)')
ax_abs.set_ylabel('Absorbance (mAu)')
ax_temp.set_ylabel('Temperature (°C)')
plt.legend((line_abs, line_temp), ('UV1 280nm', 'Temp °C'), frameon=False)
fig.tight_layout()
# plt.savefig('test.png')
plt.show()