在同一窗口中绘制多种类型的图表(线图、散点图、柱状图等)

6 投票
2 回答
10630 浏览
提问于 2025-04-17 01:50

我想在同一个窗口里画两种图表(也就是一张折线图和一张散点图)。折线图中的数据是一些浮动的数字,表示气候指数(Y)和小数年份(X)。而我想要的第二张图是散点图,数据也是类似的,只不过是表示河流流量(Y)和小数年份(X)。我尝试用双x轴和一个额外的y轴来实现这个散点图,代码如下:

    import mpl_toolkits
    from mpl_toolkits.axes_grid1 import host_subplot
    import matplotlib.pyplot as plt

    host = host_subplot(111)
    par = host.twinx()

    host.set_xlim(1880, 2020)
    host.set_ylim(-5, 10)

    host.set_xlabel("Time")
    host.set_ylabel("PDSI Region 01")
    par.set_ylabel("Minimum 10% Annual 7-day Non-exceedance Flow (cfs)")

    x1 = timearray
    y1 = pdsiarray01
    x2 = upAmm_yr
    y2 = upAmm_min

    p1, = host.plot(x1, y1, label="PDSI01")
    p2, = par.scatter(x2, y2, label="Annual Lowflow Upper Amm")

    par.set_ylim(30, 60)

    host.legend()
    host.axis["left"].label.set_color(p1.get_color())
    par.axis["right"].label.set_color(p2.get_color())

    plt.draw()
    plt.show()

但是我遇到了这个错误代码:

    TypeError: cannot perform reduce with flexible type

这段代码在我把散点图的部分改成折线图时可以正常工作,但那样就变成了第二张折线图。我想要散点图的主要原因是第二组数据的点比较少,连接这些点的线看起来很杂乱(我其实只想突出某个时间点)。如果用柱状图代替散点图也可以。任何建议或帮助都非常感谢!

2 个回答

1

我不能完全复现你遇到的错误,但我觉得在p2后面加逗号是多余的,因为scatter只会返回一个值。当我把这个改了之后,你的代码在我这边能正常运行,只是p2是一个CircleCollection,它没有get_color这个方法。你需要把它改成p2.get_facecolor()或者其他类似的东西。

6

为什么不在这两种情况下都使用 plot 呢?

import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Generate some random data
time = mdates.drange(datetime.datetime(2010, 1, 1), 
                     datetime.datetime(2011, 1, 1),
                     datetime.timedelta(days=5))
y1 = np.cumsum(np.random.random(time.size) - 0.5)
y2 = np.cumsum(np.random.random(time.size) - 0.5)
y2 = y2 * 20 + 10

# Plot things up...
fig = plt.figure()
host = fig.add_subplot(111)
par = host.twinx()

host.set_ylabel('One Thing')
par.set_ylabel('Another')

line1, = host.plot(time, y1)
line2, = par.plot(time, y2, 'go')
host.legend([line1, line2], ['Item 1', 'Item 2'])

host.xaxis_date()

plt.show()

enter image description here

撰写回答