【问题标题】:Matplotlib plot changes with different data structure (same data)Matplotlib 绘图随不同数据结构的变化(相同数据)
【发布时间】:2017-11-04 04:30:29
【问题描述】:

使用 matplotlib 创建散点图会给我一个空的或正确的图,这取决于我是从带有 from_dict 的字典还是从带有简单 pandas.DataFrame 的列表中构建 pandas 数据框。

import pandas as pd
import matplotlib.pyplot as plt 
list_data  = ['2016-10-06', '2016-09-24', 55, 'dummy', 0.510823, 0.29431]
columns    = ['master', 'slave', 'baseline', 'coh', 'coh_mean', 'coh_std']
dict_data  = dict(zip(columns, list_data))
data       = pd.DataFrame.from_dict(dict_data, orient='index').T
data.slave = pd.to_datetime(data.slave)
fig, axes  = plt.subplots()
axes.scatter(data.slave.values, data.baseline.values)
plt.show()

结果:

empty plot

同时:

list_data  = ['2016-10-06', '2016-09-24', 55, 'dummy', 0.510823, 0.29431]
columns    = ['master', 'slave', 'baseline', 'coh', 'coh_mean', 'coh_std']

data = pd.DataFrame([list_data], columns=columns)
data.slave = pd.to_datetime(data.slave)
fig, axes  = plt.subplots()
axes.scatter(data.slave.values, data.baseline.values)
plt.show()

结果:

correct plot

MacOS Sierra 10.12.6 ||蟒蛇:v3.6.2 || matplotlib: v2.0.2 ||熊猫 v0.20.3

我尝试了各种后端以及 python: v2.7 无济于事。 谁能解释为什么会发生这种情况(甚至重现):OverflowError with Matplotlib and datetime)?

【问题讨论】:

  • 正如已经对另一个问题发表的评论,我无法重现这一点。我得到了两个代码相同的输出。

标签: python pandas matplotlib


【解决方案1】:

发生这种情况是因为从字典创建数据帧(使用上述方法)它不会推断数据类型。它可能在以后的版本中,但我正在运行0.20.1。出于演示目的,我重命名了您的 dfs:

df_fromdict       = pd.DataFrame.from_dict(dict_data, orient='index').T
df_fromdict.slave = pd.to_datetime(df_fromdict.slave)

df_fromdict.dtypes
master              object
slave       datetime64[ns]
baseline            object # notice here your baseline column is not recognized as int
coh                 object
coh_mean            object
coh_std             object
dtype: object


df_fromlist = pd.DataFrame([list_data], columns=columns)
df_fromlist.slave = pd.to_datetime(df_fromlist.slave)

df_fromlist.dtypes
master              object
slave       datetime64[ns]
baseline             int64 # recognized as int by default
coh                 object
coh_mean           float64
coh_std            float64
dtype: object

尝试以下作为测试,您的第一个散点图应该会按预期显示:

fig, axes  = plt.subplots()
axes.scatter(df_fromdict.slave.values, df_fromdict.baseline.astype(int).values)
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多