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

时间:2017-05-26 02:04:39

标签: python matplotlib

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

我已经附加了excel文件,其中包含原始数据和附加图像。

https://www.dropbox.com/s/g7r772mqlkpphla/se.xls?dl=0和:

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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()

这是图: test.png

编辑:

这是2 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_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()

这是图: test.png

正如matplotlib's How-To中提到的那样:"目前不支持两个以上的比例,尽管它位于愿望清单上#34;。