簡體   English   中英

根據用戶輸入繪制特定列

[英]plotting specific columns based on user input

我有一個具有以下設置的數據框:

      a     c     g     s
Ind   b     d     t     d 
0    11    12     22    33
1    13    14     44    101

目標是通過 GUI 接收來自用戶的輸入,將輸入保存為列表並將其與數據幀中的標題列表進行比較。 如果兩者匹配,則繪制它們匹配的列(該列將是 y 軸,索引將是 x 軸)。

例如,如果用戶選擇[('c','d')]然后我希望代碼繪制該列。 這是我到目前為止所擁有的。

df = pd.read_csv('foo.csv',sep=r'\s*,\s*', encoding='ascii', engine='python')
header_list = [('a','b'),('c','d'),('g','t'),('s','d')]
user_Input_list = [('c','d')]
sub_list = []

for contents in header_list:
    for contents2 in user_Input_list:
        if contents == contents2:
            ax = df.reset_index().plot(x='Ind', y=x[header_list], kind='bar')
            for p in ax.patches:
                ax.annotate('{:.2E}'.format(Decimal(str(p.get_height()))),
                            (p.get_x(),p.get_height()))
            plt.tight_layout()
            plt.show()

我認為問題在於我如何嘗試使用y=x[header_list]選擇 y 軸。

編輯

這是我運行上述代碼時收到的錯誤消息。

Traceback (most recent call last):
  File "/home/JM9/PycharmProjects/subfolder/subfolder.py", line 360, in <module>
    ax = x.reset_index().plot(x='Ind', y=x[header_list], kind='bar')
  File "/home/JM9/PycharmProjects/subfolder/venv/lib/python3.6/site-packages/pandas/plotting/_core.py", line 780, in __call__
    data = data[y].copy()
  File "/home/JM9/PycharmProjects/subfolder/venv/lib/python3.6/site-packages/pandas/core/frame.py", line 2982, in __getitem__
    return self._getitem_frame(key)
  File "/home/JM9/PycharmProjects/subfolder/venv/lib/python3.6/site-packages/pandas/core/frame.py", line 3081, in _getitem_frame
    raise ValueError("Must pass DataFrame with boolean values only")
ValueError: Must pass DataFrame with boolean values only

我無法弄清楚您的示例代碼,可以幫助解決問題的一件事是重新創建一個更簡單的版本,而不是難以處理的列名。

import random
import pandas as pd

data={
    'a': [random.randint(0, 50) for i in range(4)],
    'b': [random.randint(0, 50) for i in range(4)],
    'c': [random.randint(0, 50) for i in range(4)]
}

df = pd.DataFrame(data)
df.index = df.index.rename('Ind')

user_input = 'b'

if user_input in df.columns:
    ax = df[user_input].plot(x='Ind', kind='bar')

一些有用的要點:(a) 而不是循環,你可以執行一個簡單的測試來查看用戶的輸入是否等於數據框列( if user_input in df: )和(b)你可以調用.plot()反對個別列。

編輯:將'b'更改為user_input

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM