【问题标题】:Python3 MatPlotLib : How can I get Multiple Line PlotsPython3 MatPlotLib:如何获得多线图
【发布时间】:2015-10-24 22:56:33
【问题描述】:

我有一个这样的元组列表:

list_months = [ ('A', 'January'),
                ('A', 'January'),
                ('A', 'January'),  # Total 10 instances of ('A', 'January')
                ('A', 'March'),
                ('A', 'March'),
                ('A', 'March'),
                ('A', 'February'),
                ('A', 'February'),
                .............
                ('B', 'January'),
                ('B', 'January'),  # Total 15 instances of ('B', 'January')
                ('B', 'July'),
                ('B', 'July'),
                ............. ]

这是通过 Pandas 数据框获得的:

for index, val in b['Incident Reported Date Time'].iteritems():
    list_months.append((index, str(val)))

我希望能够生成一个 MatPlotLib 图:
X 轴 -> 月
Y 轴 -> 体积
多条彩色线 -> 每条线代表“A”、“B”、“C”等。


例如,在这张图片中,红线代表“A”,蓝线代表“B”。
由于 ('A', 'January') 有 10 个,它在 Y 轴的 10 上显示 1 月份的红线,而 ('B', January') 有 15 个,所以它显示蓝线一月份在 Y 轴的 15 点。

如何在 Python3 的 matplotlib 中动态生成这个和图例?
该图应该是示例图像中的折线图。

【问题讨论】:

  • 我建议你看看pandas。如果您将数据存储在 pandas DataFrame 中,您将能够使用它的分组和绘图功能来完成此任务。
  • 我将 pandas 中的数据提取到一个元组列表中,以便于绘制。数据最初来自 Pandas 数据框的 2 列。使用命令for index, val in b['Incident Reported Date Time'].iteritems(): list_months.append((index, str(val)))
  • 提示:这只是 matplotlib,而不是 MatPlotLib。检查website

标签: python pandas matplotlib graph plot


【解决方案1】:

如果将数据留在 DataFrame 中,绘图会更容易。我使用您帖子中的示例数据制作了一个示例 DataFrame:

list_months = [ ('A', 'January'),
                ('A', 'January'),
                ('A', 'January'),  # Total 10 instances of ('A', 'January')
                ('A', 'March'),
                ('A', 'March'),
                ('A', 'March'),
                ('A', 'February'),
                ('A', 'February'),
                ('B', 'January'),
                ('B', 'January'),  # Total 15 instances of ('B', 'January')
                ('B', 'July'),
                ('B', 'July')
            ]
d = pandas.DataFrame(list_months, columns=["Item", "Month"]).fillna(0)

>>> d
   Item     Month
0     A   January
1     A   January
2     A   January
3     A     March
4     A     March
5     A     March
6     A  February
7     A  February
8     B   January
9     B   January
10    B      July
11    B      July

那么你就可以轻松搞定剧情了:

>>> d.groupby(['Month', 'Item']).size().unstack().loc[['January', 'February', 'March', 'July']].fillna(0).plot(kind='line')

.loc['January', 'February', ...] 位只需要按时间顺序而不是字母顺序获取月份。从长远来看,您最好通过日期时间对象或代表月份的数字来存储此信息。)

【讨论】:

  • 如果我有一个日期时间对象列并且必须将其转换为在图表中按月显示,代码会有什么不同?
  • @MeghdeepRay:如果您对如何使用 datetime 对象绘制数据有疑问,最好的办法是提出一个单独的问题,在该问题中您提供带有 datetime 对象的示例数据。
  • 我提出了一个后续问题,如果您能提供帮助将不胜感激:stackoverflow.com/questions/31777482/…
猜你喜欢
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多