首页 > 解决方案 > 提高 Pandas 数据透视图的可读性

问题描述

我有一个包含 [910 行 x 1 列] 的数据透视表。当用 pandas plot 绘制时,可读性不好。请看下图。我想把它作为一个 Excel 数据透视图。我的意思是如果我单击图表中的特定点,它应该显示所有详细信息[Device_ID、Temp 等]。

请查看我的数据框(数据透视表)。

Frequency                  0.8     1.6
Device_ID Temp  Supply                
FF_2649   -40.0 1.65   -100.72 -101.35
                1.71   -100.61 -101.74
                1.80   -100.74 -101.64
                1.89   -100.63 -101.69
                3.60   -100.60 -101.46
...                        ...     ...
TT_2441    85.0 1.65    -94.99  -94.97
                1.71    -94.85  -95.24
                1.80    -95.02  -94.97
                1.89    -94.69  -96.20
                3.60    -94.90  -94.91

你能告诉我如何提高可读性吗?

我可以知道有什么方法可以将其绘制为 excel 文件。

在此处输入图像描述

标签: pythonpandasmatplotlib

解决方案


  • 针对多索引合成数据以类似于问题
  • 使用plotly作为您的绘图后端工具提示是解决方案的一部分
  • 目前不支持多索引,所以我改为连接索引来演示
import pandas as pd
import numpy as np
df = pd.DataFrame(index=pd.MultiIndex.from_product([list("abcd"), list("efgh"), list("xyz")], names=["cat1","cat2","cat3"]))
df["value"] = np.random.randint(1,200, len(df))

pd.options.plotting.backend = "plotly"
df.reset_index().pipe(lambda d: d.set_index(d.cat1+d.cat2+d.cat3)).loc[:,"value"].plot()

在此处输入图像描述

使用带有多索引的 plotly API

  • 需要将多索引组合成x
  • 从您的评论中,我假设也有多个列。为每列生成一个散点图
import pandas as pd
import numpy as np
import plotly.graph_objects as go

s = 100000
df_new = pd.DataFrame({"Device_ID":np.random.choice(["FF_2649","FF_2700","FF_2800","TT_2000","TT_2100","TT_2441"], s),
                      "Temp":np.random.randint(-8, 19, s)*5,
                       "Supply":np.random.choice([1.65,1.71,1.80,1.89,3.60], s),
                       "Frequency":np.random.choice([0.8,1.6], s),
                       "NoiseLevel":np.random.uniform(-102,-94, s)
                      })

multi_index = pd.pivot_table(df_new, index = ['Device_ID', 'Temp' ,'Supply'],columns = 'Frequency', values = 'NoiseLevel',)
# given data is randmoly generated, give it some order...
multi_index.loc[:,[0.8,1.6]] = multi_index.assign(p=lambda d: (d[0.8]*2)+(d[1.6]*.5)).sort_values("p").drop(columns="p").values

# pivot gives a column per frequency.  SO question did not indicate this....
# generate a line for each column in pivot table.  concat values of multi-index to make it work with plotly
data = [go.Scatter(x=[" ".join([str(p) for p in x]) for x in multi_index.index], y=multi_index[c], 
                   mode='lines+markers', name=f'Noise Level {c}', marker={"size":10},line={"dash":"dot"})
 for c in multi_index.columns]
layout=go.Layout(title='Noise Level') 
figure=go.Figure(data=data,layout=layout) 
figure

在此处输入图像描述


推荐阅读