使用 matplotlib 在 python 中绘制盒须图与日期时间
Box and whisker plot versus date-time in python using matplotlib
我有以下数据:
Total_flux_plot_time = [DT.datetime(2018, 8, 18, 8, 15), DT.datetime(2018, 8, 19, 11, 40),
DT.datetime(2018, 8, 20, 7, 50), DT.datetime(2018, 8, 21, 7, 15),
DT.datetime(2018, 8, 22, 6, 30, 30),
DT.datetime(2018, 8, 23, 6, 50),
DT.datetime(2018, 8, 24, 9, 10), DT.datetime(2018, 8, 24, 21,35),
DT.datetime(2018, 8, 25, 9, 17), DT.datetime(2018, 8, 25, 16, 55),
DT.datetime(2018, 8, 26, 3, 30), DT.datetime(2018, 8, 27, 12, 30),
DT.datetime(2018, 8, 28, 2, 15)]
Total_flux_min = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1230.0, 0.0, 2140.0, 4.0, 0.0, 0.0]
Total_flux_Q1 = [4.6668, 1.1667, 3.5000999999999998, 1.1667, 0.0, 0.0, 1.1667,
1484.0, 0.0, 2440.0, 28.000000000000004, 0.0, 2.0]
Total_flux = [7.0001999999999995, 2.3334, 4.6668, 2.3334, 0.0, 0.0, 1.1667,
1598.0, 2.0, 2680.0, 34.0, 0.0, 4.0]
Total_flux_Q3 = [8.1669, 4.6668, 7.0001999999999995, 3.5000999999999998, 0.0,
1.1667, 2.3334, 1707.9999999999998, 2.0, 2820.0, 44.0, 0.0, 6.0]
Total_flux_max = [21.0006, 12.8337, 21.0006, 12.8337, 8.1669, 17.5005, 9.3336,
1976.0000000000002, 12.0, 3279.9999999999995, 88.0, 6.0, 246.0]
d = {'Date_time': Total_flux_plot_time,
'Minimum': Total_flux_min,
'First quartile': Total_flux_Q1,
'Median': Total_flux,
'Third quartile': Total_flux_Q3,
'Maximum:': Total_flux_max}
test = pd.DataFrame(d)
我想要做的是使用最小值、Q1、中值、Q3 和最大值与 x 轴上的日期时间在 y 轴上绘制盒须图。鉴于值的范围,我正在考虑在 y 轴上使用 'symlog'。但是,我无法让箱线图与日期时间一起工作(使用 matplotlib)。我一直在尝试使用补丁中的矩形,但这比我想象的要棘手。据推测,我需要在这里使用 date2num,但我无法确切地理解如何使用。如有任何建议,我们将不胜感激。
您可以使用 the Axes.bxp() function 从汇总统计数据中轻松绘制箱线图。您必须对您的词典进行一些转换才能使它们具有正确的格式,并且需要一个 positions=
参数来沿 x 轴放置箱线图。
如您所料,您必须使用 date2num
转换日期,但在那之后,只需找到正确的 locator/formatter 来美化 x 轴刻度标签.有关详细信息,请参阅 the documentation on the dates
module。
import matplotlib.dates as mdates
stats = [{'med':med, 'q1':q1, 'q3':q3, 'whislo':low, 'whishi':high}
for med,q1,q3,low,high in zip(Total_flux, Total_flux_Q1, Total_flux_Q3, Total_flux_min, Total_flux_max)]
fig, ax = plt.subplots()
ax.set_yscale('symlog')
ax.bxp(stats, positions=matplotlib.dates.date2num(Total_flux_plot_time), showfliers=False)
locator = mdates.AutoDateLocator(minticks=3, maxticks=7)
formatter = mdates.AutoDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
fig.autofmt_xdate()
我有以下数据:
Total_flux_plot_time = [DT.datetime(2018, 8, 18, 8, 15), DT.datetime(2018, 8, 19, 11, 40),
DT.datetime(2018, 8, 20, 7, 50), DT.datetime(2018, 8, 21, 7, 15),
DT.datetime(2018, 8, 22, 6, 30, 30),
DT.datetime(2018, 8, 23, 6, 50),
DT.datetime(2018, 8, 24, 9, 10), DT.datetime(2018, 8, 24, 21,35),
DT.datetime(2018, 8, 25, 9, 17), DT.datetime(2018, 8, 25, 16, 55),
DT.datetime(2018, 8, 26, 3, 30), DT.datetime(2018, 8, 27, 12, 30),
DT.datetime(2018, 8, 28, 2, 15)]
Total_flux_min = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1230.0, 0.0, 2140.0, 4.0, 0.0, 0.0]
Total_flux_Q1 = [4.6668, 1.1667, 3.5000999999999998, 1.1667, 0.0, 0.0, 1.1667,
1484.0, 0.0, 2440.0, 28.000000000000004, 0.0, 2.0]
Total_flux = [7.0001999999999995, 2.3334, 4.6668, 2.3334, 0.0, 0.0, 1.1667,
1598.0, 2.0, 2680.0, 34.0, 0.0, 4.0]
Total_flux_Q3 = [8.1669, 4.6668, 7.0001999999999995, 3.5000999999999998, 0.0,
1.1667, 2.3334, 1707.9999999999998, 2.0, 2820.0, 44.0, 0.0, 6.0]
Total_flux_max = [21.0006, 12.8337, 21.0006, 12.8337, 8.1669, 17.5005, 9.3336,
1976.0000000000002, 12.0, 3279.9999999999995, 88.0, 6.0, 246.0]
d = {'Date_time': Total_flux_plot_time,
'Minimum': Total_flux_min,
'First quartile': Total_flux_Q1,
'Median': Total_flux,
'Third quartile': Total_flux_Q3,
'Maximum:': Total_flux_max}
test = pd.DataFrame(d)
我想要做的是使用最小值、Q1、中值、Q3 和最大值与 x 轴上的日期时间在 y 轴上绘制盒须图。鉴于值的范围,我正在考虑在 y 轴上使用 'symlog'。但是,我无法让箱线图与日期时间一起工作(使用 matplotlib)。我一直在尝试使用补丁中的矩形,但这比我想象的要棘手。据推测,我需要在这里使用 date2num,但我无法确切地理解如何使用。如有任何建议,我们将不胜感激。
您可以使用 the Axes.bxp() function 从汇总统计数据中轻松绘制箱线图。您必须对您的词典进行一些转换才能使它们具有正确的格式,并且需要一个 positions=
参数来沿 x 轴放置箱线图。
如您所料,您必须使用 date2num
转换日期,但在那之后,只需找到正确的 locator/formatter 来美化 x 轴刻度标签.有关详细信息,请参阅 the documentation on the dates
module。
import matplotlib.dates as mdates
stats = [{'med':med, 'q1':q1, 'q3':q3, 'whislo':low, 'whishi':high}
for med,q1,q3,low,high in zip(Total_flux, Total_flux_Q1, Total_flux_Q3, Total_flux_min, Total_flux_max)]
fig, ax = plt.subplots()
ax.set_yscale('symlog')
ax.bxp(stats, positions=matplotlib.dates.date2num(Total_flux_plot_time), showfliers=False)
locator = mdates.AutoDateLocator(minticks=3, maxticks=7)
formatter = mdates.AutoDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
fig.autofmt_xdate()