亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用seaborn散點圖截斷Y軸值

使用seaborn散點圖截斷Y軸值

波斯汪 2023-10-18 21:23:15
我在繪制 Y 軸值范圍從 1 到 20+ 百萬的大型 CSV 文件時遇到問題。我現在面臨兩個問題。Y 軸沒有顯示它應該顯示的所有值。使用原始數據時,最多顯示600萬條,而不是顯示全部數據最多2000萬條。在我下面放置的示例數據(較小的數據)中,它僅顯示第一個 Y 軸值,不顯示任何其他值。在標簽部分中,由于我使用了色調和樣式=名稱,因此“名稱”顯示為標簽標題和內部項目。問題:誰能給我一個示例或幫助我回答如何顯示所有 Y 軸值?我該如何修復它以便所有 Y 值都顯示出來?如何在不刪除散點的形狀和顏色的情況下刪除標簽部分下的“名稱”?(請讓我知道是否存在任何來源,或者這個問題在其他帖子上得到了回答,但沒有將其標記為重復。如果我有任何需要解決的語法/拼寫問題,也請告訴我。謝謝!)您可以在下面找到我用來繪制圖表和示例數據的函數。def test_graph (file_name):    data_file = pd.read_csv(file_name, header=None, error_bad_lines=False, delimiter="|", index_col = False, dtype='unicode')    data_file.rename(columns={0: 'name',                              1: 'date',                              2: 'name3',                              3: 'name4',                              4: 'name5',                              5: 'ID',                              6: 'counter'}, inplace=True)    data_file.date = pd.to_datetime(data_file['date'], unit='s')        norm = plt.Normalize(1,4)    cmap = plt.cm.tab10    df = pd.DataFrame(data_file)     # Below creates and returns a dictionary of category-point combinations,    # by cycling over the marker points specified.       points = ['o', 'v', '^', '<', '>', '8', 's', 'p', 'H', 'D', 'd', 'P', 'X']    mult = len(df['name']) // len(points) + (len(df['name']) % len(points) > 0)    markers = {key:value for (key, value)               in zip(df['name'], points * mult)} ; markers       sc = sns.scatterplot(data = df, x=df['date'], y=df['counter'], hue = df['name'], style = df['name'], markers = markers, s=50)    ax.set_autoscaley_on(True)                     ax.set_title("TEST", size = 12, zorder=0)                      plt.legend(title="Names", loc='center left', shadow=True, edgecolor = 'grey', handletextpad = 0.1, bbox_to_anchor=(1, 0.5))                            
查看完整描述

1 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

首先,對您的帖子進行一些改進:您缺少導入語句


import pandas as pd

import matplotlib.pyplot as plt

from matplotlib import ticker

import seaborn as sns

線路


df = pd.DataFrame(data_file)

不是必需的,因為data_file已經是一個 DataFrame 了。線條


points = ['o', 'v', '^', '<', '>', '8', 's', 'p', 'H', 'D', 'd', 'P', 'X']

mult = len(df['name']) // len(points) + (len(df['name']) % len(points) > 0)

markers = {key:value for (key, value)

           in zip(df['name'], points * mult)}

不要points像您期望的那樣循環,也許可以按照此處的itertools建議使用。另外,設置 yticks 像


ax.yaxis.set_major_locator(ticker.MultipleLocator(100))

如果您的數據范圍為 0 到 2000 萬,則每 100 可能太多,請考慮將 100 替換為 1000000。


我能夠重現你的第一個問題。使用df.dtypes我發現該列counter存儲為 type object。添加行


df['counter']=df['counter'].astype(int)

為我解決了你的第一個問題。不過,我無法重現您的第二個問題。對于我來說,結果圖是這樣的:

https://img1.sycdn.imooc.com/652fdc8c0001c8a117260932.jpg

您是否嘗試將所有軟件包更新到最新版本?


編輯:作為您評論的后續內容,您還可以通過替換 1 來調整圖中的 xticks 數量


ax.xaxis.set_major_locator(ticker.MultipleLocator(1))

更高的數字,比如 10。結合我的所有建議并刪除看似不必要的函數定義,我的代碼版本如下所示:


import pandas as pd

import matplotlib.pyplot as plt

from matplotlib import ticker

import seaborn as sns

import itertools


fig = plt.figure()

ax  = fig.add_subplot()


df = pd.read_csv(

    'data.csv',

    header          = None,

    error_bad_lines = False,

    delimiter       = "|",

    index_col       = False,

    dtype           = 'unicode')

df.rename(columns={0: 'name',

                   1: 'date',

                   2: 'name3',

                   3: 'name4',

                   4: 'name5',

                   5: 'ID',

                   6: 'counter'}, inplace=True)


df.date = pd.to_datetime(df['date'], unit='s')

df['counter'] = df['counter'].astype(int)


points  = ['o', 'v', '^', '<', '>', '8', 's', 'p', 'H', 'D', 'd', 'P', 'X']

markers = itertools.cycle(points) 

markers = list(itertools.islice(markers, len(df['name'].unique())))


sc = sns.scatterplot(

    data    = df,

    x       = 'date',

    y       = 'counter',

    hue     = 'name',

    style   = 'name',

    markers = markers,

    s       = 50)           


ax.set_title("TEST", size = 12, zorder=0)             

ax.legend(

    title          = "Names",

    loc            = 'center left',

    shadow         = True,

    edgecolor      = 'grey',

    handletextpad  = 0.1,

    bbox_to_anchor = (1, 0.5))             

           

ax.xaxis.set_major_locator(ticker.MultipleLocator(10))

ax.yaxis.set_major_locator(ticker.MultipleLocator(1000000))             

ax.minorticks_off()

      

ax.set_xlabel("Dates", fontsize = 12, labelpad = 7)

ax.set_ylabel("Counter", fontsize = 12)

ax.grid(axis='y', color='0.95')


fig.autofmt_xdate(rotation = 30)  

plt.gcf().subplots_adjust(bottom=0.15)   

plt.show()



查看完整回答
反對 回復 2023-10-18
  • 1 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號