【发布时间】:2017-06-29 18:35:54
【问题描述】:
我正在从一个列结构或多或少像这样的文本文件中输入数据:
x y density
我需要绘制密度(x,y)的热图。
我刚刚开始使用 pyplot 和 pandas,我不确定如何有效地实现此功能。
我首先尝试只加载列并使用
进行绘图plt.pcolor( OrbData[['x']], OrbData[['y']], OrbData[['density']] )
但这失败了,因为颜色值必须在一个数组中。所以现在我将 x,y 值用作多索引并解压缩数据框。
这是我的脚本
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
Morbs = 2
OrbFile = "69.0000000orbs.dat"
### Load in the data using pandas
OrbData = pd.read_csv(OrbFile, sep='\s+', usecols = [ 0, 1, 7 ], header= None, names=['x','y','density'], skiprows=2)
OrbData = OrbData.set_index(['x','y'])
OrbData=OrbData.unstack()
plt.figure(1)
plt.pcolor(OrbData[['density']], cmap='hot')
plt.gca().set_aspect('equal')
plt.show()
这几乎可以完美运行,但图中的轴显示记录号 (0,50) 而不是索引值 (-2,2)。
如果我尝试 plt.pcolor(OrbData[['x']], OrbData[['y']], OrbData[['Mag1']], cmap='hot') 处理解压后的数据,我会收到错误消息
KeyError: "['x'] not in index".
如果我尝试使用 OrbData.index 访问索引值,我只能恢复 x 值(行),我不知道如何访问 y 值(列)。
我可以想出几种方法来做到这一点,但它们都觉得老套和低效。
1) 在解包之前分别保存 x,y 列
2) 转置数据帧并使用 OrbData.index 获取 y 值
3) 以某种方式手动重新缩放 pyplot 中的轴
我正在尝试为动画制作大约 10^5 个图,每个图至少有 10^4 条记录,所以我需要一些不太浪费的东西。
必须有一些简单的方法以 pcolor 可以读取的格式从列数据中提取值。
有什么想法吗?
【问题讨论】:
-
使用 matplotlib.axes.Axes.contourf 方法:matplotlib.org/api/_as_gen/matplotlib.axes.Axes.contourf.html 这将为您提供以 x 和 y 为轴(1. 和 2. 维)和密度为第三维的 3D 图像。如果您调整 cmap 参数,您可以为密度绘制不同的颜色
-
您在这里没有得到满意答案的原因是人们不知道您的数据是如何组织的以及它的外观。请提供minimal reproducible example 和清晰的问题描述。
标签: python pandas matplotlib plot