Matplotlib فقط برای نمودارهای استاتیک نیست. در حالی که رابط های کاربری گرافیکی معمولا با کتابخانه های رابط کاربری گرافیکی و چارچوب هایی مانند پایکیوت, تینکر, کیوی و wxPython، و در حالی که پایتون ادغام عالی با PyQt، Tkinter دارد و wxPython – نیازی به استفاده از هیچ یک از اینها برای برخی از عملکردهای رابط کاربری گرافیکی اساسی نیست ابزارک های Matplotlib.
La matplotlib.widgets
ماژول چندین کلاس دارد، از جمله AxesWidget
، از آن Button
s, CheckButton
s, Slider
s, TextBox
es و غیره مشتق شده اند. اینها همه قبول دارند Axes
آنها به عنوان یک و تنها آرگومان سازنده اجباری اضافه می شوند و موقعیت آنها باید به صورت دستی تنظیم شود. نکته قابل توجه این است که ویجت محور است، بنابراین شما یک را ایجاد خواهید کرد Axes
نمونه ای برای هر ویجت
نکته دیگری که باید به آن توجه کرد این است شما باید ارجاع به ویجت ها را حفظ کنید در غیر این صورت، آنها ممکن است زباله جمع آوری شود.
هر یک از آنها را نیز می توان با تنظیم غیرفعال کرد active
به False
، در این صورت به هیچ رویدادی مانند کلیک روی آن پاسخ نمی دهند. همانطور که گفته شد، ما می توانیم از طریق عناصر و اجزای مختلف رابط کاربری گرافیکی، نوع جدیدی از تعامل را به طرح های خود معرفی کنیم.
توجه داشته باشید: قرار نیست Matplotlib برای ایجاد رابط کاربری گرافیکی با کیفیت بالا و همچنین سیستمهای کاربرپسند استفاده شود. این ویجت ها ابتدایی هستند، واقعا عالی به نظر نمی رسند و عملکرد محدودی دارند. آنها بهعنوان راهی برای نمونهسازی اولیه و آزمایش چیزها هستند، نه اینکه واقعاً آنها را ارسال کنند.
اگر قبلاً با PyQt کار کردهاید - ممکن است متوجه شوید که نحو کلی و رویکرد اضافه کردن این ویجتها و همچنین اتصال آنها به کنترلکنندههای رویداد نسبتاً آشناست.
اضافه کردن دکمه ها
بیایید شروع کنیم دکمه ها - از matplotlib.widgets
ماژول a را تعریف می کند Button
کلاس برای اتصال به آن، با شماره تماس می گیریم on_clicked()
تابع، که تابعی را که ما عرضه می کنیم اجرا می کند. هنگامی که یک کلیک شناسایی شد، تابع اجرا می شود.
در حین ایجاد دکمه، یک را اختصاص می دهیم Axes
به آن، برای موقعیت یابی استفاده می شود. ما همچنین می توانیم در یک عبور کنیم label
در آن زمان، برای اضافه کردن متن و حاشیه نویسی آن برای یک کاربر. را color
و hovercolor
آرگومان ها رنگ دکمه را قبل و بعد از قرار گرفتن روی آن مشخص می کنند.
از آنجایی که ما از موقعیت و فضای همه ویجت ها مراقبت می کنیم - بیایید a ایجاد کنیم Figure
و Axes
، مقداری فاصله در پایین برای اضافه کردن یک دکمه در نظر بگیرید و یک Scatter Plot خالی را رسم کنید. سپس، یک را تعریف می کنیم EventHandler
کلاس، که یک متد واحد دارد add_random()
. این روش دو عدد تصادفی تولید میکند و یک نشانگر برای آنها بر روی آن ترسیم میکند Axes
ما قبلا ایجاد کرده ایم و تماس گرفته ایم plt.draw()
، که دوباره ترسیم می کند Figure
. هنگام بهروزرسانی طرحها، همیشه باید تماس بگیریم plt.draw()
دوباره برای به روز رسانی آن:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
plot = ax.scatter([], []) class EventHandler: def add_random(self, event): x = np.random.randint(0, 100) y = np.random.randint(0, 100) ax.scatter(x, y) plt.draw() # Axes for the Button and positioning
# xposition and yposition in percentages, width, height
button_ax = plt.axes([0.7, 0.05, 0.2, 0.07])
# Create Button and assign it to `button_ax` with label
button = Button(button_ax, 'Add Random', color='green', hovercolor='red')
# On a detected click, execute add_random()
button.on_clicked(EventHandler().add_random) plt.show()
این نتیجه در Figure
، با خالی Axes
داخل آن و یک دکمه در گوشه سمت راست بالای صفحه نمایش به تنهایی Axes
:
و پس از چند ده بار فشار دادن دکمه، ما ax
با نشانگرهای تصادفی پر می شود:
در شرایط عملی تر، ما می توانیم یک را ایجاد کنیم چرخه ویژگی هایی که با فشار دادن هر دکمه ترسیم می شوند. این به چند ترفند نیاز دارد EventHandler
و همچنین دکمه دیگری برای بازگشت به آن چرخه.
بیایید از کیفیت شراب قرمز دوباره مجموعه داده، و چندین ویژگی را در مقابل تجسم کنید الکل ویژگی. از آنجایی که نمیتوانیم با نوشتن کد برای رسم یک ویژگی در برابر دیگری، و سپس اصلاح آن کد به منظور ترسیم ویژگی دیگر در برابر دیگری، این کدها را به صورت جداگانه ترسیم کنیم.
ایجاد یک ماتریس پراکندگی ممکن است به ما در اینجا کمک کند، اما اگر مجموعه داده دارای ویژگیهای زیادی باشد، نسبتاً غیرقابل خواندن خواهد بود و راه دوری نخواهیم برد. اگر می خواهید داشته باشید هر دو توطئه های در مقیاس بزرگ که به راحتی می توانید مشاهده و تفسیر کنید، همچنین به عنوان داشتن چندین ویژگی که بدون هیچ تلاش اضافی در حال چرخش هستند - می توانید این فرآیند را با دکمه ها خودکار کنید:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv')
plot = ax.scatter([], []) class EventHandler: i = 0 # Find and plot next feature, re-draw the Axes def next_feature(self, event): # If the counter is at the end of the columns # Revert it back to 0 to cycle through again if self.i >= len(df.columns): self.i = 0 # Clear Axes from last plot ax.cla() # Plot a feature against a feature located on the `i` column ax.scatter(df['alcohol'], df.iloc[:,self.i]) # Set labels ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) # Increment i self.i += 1 # Update Figure plt.draw() def previous_feature(self, event): # If the counter is at the start of the columns # Revert it back to the last column to cycle through if self.i <= 0: self.i = len(df.columns)-1 ax.cla() ax.scatter(df['alcohol'], df.iloc[:,self.i]) ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) self.i -= 1 plt.draw() # Add buttons
button1_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
next_button = Button(button1_ax, 'Next Feature')
next_button.on_clicked(EventHandler().next_feature) button2_ax = plt.axes([0.45, 0.02, 0.2, 0.07])
previous_button = Button(button2_ax, 'Previous Feature')
previous_button.on_clicked(EventHandler().previous_feature) plt.show()
La EventHandler
کلاس اکنون دو روش دارد - next_feature()
و previous_feature()
. هر دوی این ها بررسی می کنند که آیا شمارنده i
به پایان یا شروع لیست ستون رسیده است - و برای جلوگیری از یک IndexError
، شاخص را به مقدار مخالف بازنشانی می کنیم و a را شبیه سازی می کنیم چرخه. رفتن به زیر 0
ما را به پایان از لیست ستون، و رفتن به بالای آخرین ستون ما را به ستون اول برمی گرداند.
پس از تعیین محل قرارگیری ما - ما پاک کردن Axes
، از آنجایی که میخواهیم دوباره در بالای طرح موجود بدون پاک کردن آن نقشه بکشیم cla()
(clگوش axes). همچنین میتوانید روابط ویژگیها را با رسم بر روی یکدیگر و استفاده از آن، انباشته کنید cla()
بیانیه هنگام تنظیم مجدد شاخص در پایان / شروع چرخه.
پس از پاکسازی Axes
- ما یک بوم پاک شده برای نقاشی روی آن داریم ax.scatter()
تابع. در این مثال، ویژگی ثابت است الکل، بنابراین همیشه وجود دارد. ویژگی دیگر متفاوت است و می توان از طریق آن به آن دسترسی داشت iloc[]
، عبور در نمایه ستون. این یک را برمی گرداند Series
که می توانیم در این طرح استفاده کنیم. به همین ترتیب، ما می توانیم دسترسی داشته باشیم نام ستون ها از طریق شاخص آنها نیز - df.columns[index]
، که برای تنظیم برچسب محور Y استفاده می شود.
در نهایت شمارنده را کم یا زیاد می کنیم و فراخوانی می کنیم plt.draw()
برای به روز رسانی Figure
:
هنگامی که ما بر روی ویژگی بعدی را فشار دهید، ویژگی بعدی در لیست ستون ها در مقابل رسم می شود الکل، و Figure
به طور مناسب به روز می شود - برچسب ها، نشانگرها و مقیاس. همین امر برعکس است - ویژگی قبلی لیست را در جهت مخالف طی می کند و به ما امکان می دهد با یک مکانیسم ایمنی که هر بار به پایان یا ابتدای چرخه می رسیم شمارنده ما را تنظیم مجدد می کند، به جلو و عقب بچرخیم.
اضافه کردن دکمه های رادیویی و چک باکس ها
دکمه های رادیویی برای اجازه دادن به کاربر برای انتخاب استفاده می شود یک ارزش بیرون از چندین مقدار. فقط یک دکمه رادیویی را می توان در یک زمان انتخاب کرد و آنها معمولاً یک انتخاب را نشان می دهند. چک باکس ها اگر می خواهید به کاربر اجازه دهید چندین گزینه را همزمان انتخاب کند، می تواند استفاده شود.
توجه داشته باشید: توانایی بسیار محدودی برای بررسی وجود چک باکس وجود دارد on or خاموش. در واقع، هیچ چیزی خارج از جعبه وجود ندارد. شما فقط می توانید بررسی کنید که آیا جعبه وجود دارد یا خیر فشرده or نه، که محدودیت جدی برای نحوه استفاده از آن ایجاد می کند زیرا ما نمی دانیم که قبل از آن در چه وضعیتی بوده است. تنها گزینه این است که شمارنده/بررسی وضعیت فعلی جعبه را با یک بولی حفظ کنید و منطق را بر اساس آن تغییر دهید.
این به شما امکان می دهد، برای مثال، یک چک باکس برای هر کدام اضافه کنید استدلال سفارشی سازی از یک طرح خاص، به کاربر اجازه می دهد آنها را تنظیم کند True
or False
(بررسی شده، یا بدون علامت)، یا هر نقشه غیر متضاد دیگری بر اساس این حالت ها.
اگرچه، از آنجایی که API به خودی خود محدود است، ما خود را به استفاده مورد نظر محدود می کنیم - روشن و خاموش کردن همه چیز. ما دو ویژگی خواهیم داشت که می توانیم آنها را تغییر دهیم on و خاموش از طریق یک چک باکس توجه داشته باشید که حتی این عملکرد محدود به اشیایی است که می توانید بررسی کنید که آیا آنها قابل مشاهده هستند یا خیر.
از سوی دیگر، ما نمیخواهیم به کاربر اجازه دهیم دو مقیاس را همزمان اعمال کند، یا دو حد X را در یک زمان تعیین کند، زیرا فقط عبارت دوم در دنباله اعمال میشود. برای این موارد - از دکمه های رادیویی استفاده می کنیم.
بیایید چند دکمه رادیویی اضافه کنیم تا به کاربر اجازه دهیم محدوده محور را از طریق چند دکمه رادیویی انتخاب کند، اما همچنین به او اجازه میدهیم تجسم ویژگیها را تغییر دهد. on و خاموش:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
from matplotlib.widgets import RadioButtons fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') # Plot two line plots for two features, and turn them invisible
line1, = ax.plot(df['fixed acidity'], visible=False)
line2, = ax.plot(df['citric acid'], visible=False) class EventHandler: # set_range handler def set_range(label): if (label == 'Small Range'): ax.set_xlim(0, 1600) ax.set_ylim(0, 25) else: ax.set_xlim(0, 1600) ax.set_ylim(0, 50) plt.draw() # Turn off, if on, and on if off def apply_features(label): if (label == 'Fixed Acidity'): line1.set_visible(not line1.get_visible()) elif (label == 'Citric Acid'): line2.set_visible(not line2.get_visible()) plt.draw() # Add radio buttons and checkboxes
ranges_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
range_radio_buttons = RadioButtons(ranges_ax, ('Small Range', 'Large Range'))
range_radio_buttons.on_clicked(EventHandler.set_range) checkboxes_ax = plt.axes([0.4, 0.02, 0.25, 0.1])
checkboxes = CheckButtons(checkboxes_ax, ('Fixed Acidity', 'Citric Acid'))
checkboxes.on_clicked(EventHandler.apply_features) plt.show()
باز هم، ما دو روش در این زمینه داریم EventHandler()
کلاس – set_range()
و apply_features()
. set_range()
متد با تنظیم مقدار، محدوده را روی "کوچک" یا "بزرگ" تنظیم می کند Axes
محدودیت های X و Y. این apply_features()
عملکرد را تغییر می دهد visible
فیلد Line Plots که قبلاً بر اساس جریان آنها ساخته ایم visible
وضعیت اگر visible == True
، خط خط را خاموش می کنیم و بالعکس.
ما باید به توانایی داخلی برای بررسی نمایان بودن خطوط خطی تکیه کنیم، زیرا نمی توانیم بررسی کنیم که آیا چک باکس قبلاً علامت زده شده است یا خیر. همین توانایی را می توان با a تقلید کرد status
بولی در محدوده EventHandler()
کلاس، که تنظیم شده است True
و False
در هر کلیک، برای انواع نمودارهایی که از بررسی اینکه آیا خارج از کادر قابل مشاهده هستند پشتیبانی نمی کنند.
اجرای این کد منجر به a Figure
با دو مجموعه دکمه در پایین. اگر هر دو چک باکس را علامت بزنیم، هر دو Line Plot ظاهر می شوند:
ما می توانیم آنها را به صورت جداگانه خاموش کنیم:
و ما می توانیم محدوده را تغییر دهیم Axes
از طریق دکمه های رادیویی:
اضافه کردن جعبه متن
جعبه های متنی عادت کرده اند جمع آوری داده های کاربر - و ما می توانیم نمودارها را بر اساس این داده ها تغییر دهیم. برای مثال، میتوانیم از یک کاربر بخواهیم نام یک ویژگی را وارد کند، یا تابعی را برای تجسم نمودار ما درج کند. البته، کار با ورودی کاربر می تواند مشکل باشد - همیشه موارد لبه ای وجود دارد که باید به آنها توجه کرد.
بیایید یک اسکریپت بنویسیم که به کاربر اجازه دهد a را وارد کند نام ویژگی از یک مجموعه داده، و Axes
به روز رسانی در هر ارسال برای منعکس کردن ورودی. برای راحتی کاربر، اگر ورودی با نام ستون مطابقت نداشته باشد، به او اطلاع خواهیم داد:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') class EventHandler: def submit(feature_name): if feature_name != "" or feature_name != None: if feature_name in df: ax.cla() ax.plot(df[feature_name]) else: if len(textbox_ax.texts) > 2: del textbox_ax.texts[-1] textbox_ax.text(-2, 0.4, feature_name + ' was not found.') plt.draw() textbox_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
textbox = TextBox(textbox_ax, 'Feature Name')
textbox.on_submit(EventHandler.submit) plt.show()
ما یک بررسی ساده داریم تا ببینیم آیا ارائه شده است یا خیر feature_name
خالی است یا None
، در این صورت ما کاری انجام نمی دهیم. اگر نه، بررسی می کنیم که آیا feature_name
در وجود دارد DataFrame
، پیوست کردن پیامی مبنی بر اینکه این ویژگی در صورت عدم وجود آن یافت نشد. البته قبل از پیوست کردن متن، باید مطمئن شویم که پیام قبلی حذف شده است، تا پیام جدید با آن همپوشانی نداشته باشد. این axes.texts
اموال لیستی از همه است Text
نمونه هایی در یک Axes
. از آنجا که Axes
در حال حاضر یک Text
به عنوان مثال، متعلق به ما TextBox
، ما نمی خواهیم چیزی را حذف کنیم اگر 2 یا کمتر باشد Text
نمونه های موجود - پیام خطا و TextBox
برچسب.
اگر بالاتر از دو باشد، قبلاً یک پیام خطا دریافت کرده ایم که باید حذف شود.
اگر ویژگی is در حال حاضر در DataFrame
با این حال، ما آن را پاک می کنیم Axes
و آن را ترسیم کنید:
افزودن انتخابگرهای دهانه
انتخابگرهای دهانه می توان از آن برای اجازه دادن به کاربر برای انتخاب گستره ای از داده ها و تمرکز بر روی آن استفاده کرد و محدودیت های محور را بر اساس آن انتخاب تعیین کرد. بهطور پیشفرض، بسیاری از کتابخانهها از این قابلیت پشتیبانی میکنند، اگرچه متأسفانه Matplotlib این کار را نمیکند و ما باید این کار را به صورت دستی انجام دهیم. علاوه بر این، ما باید یک مورد اضافی اضافه کنیم "تنظیم مجدد" اگر بخواهیم را فشار دهید کوچک نمایی نیز هست.
برای افزودن انتخابگر دهانه، ما نیازی به اختصاص یک جدید کامل نداریم Axes
برای آن - ما می توانیم آن را به یک موجود متصل کنیم، که بسیار منطقی است. هنگام تولید a SpanSelector
، ما عرضه می کنیم Axes
متعلق به، و همچنین کنترل کننده رویداد، و به دنبال آن است 'horizontal'
or 'vertical'
، که می چرخد Axes
و انتخابگر دهانه هر دو.
La useblit
آرگومان معمولاً روی تنظیم می شود True
زیرا عملکرد را در اکثر Backend ها افزایش می دهد. علاوه بر این، ما چند ویژگی ظاهری مانند تنظیم کردن اضافه کرده ایم alpha
از مستطیل ایجاد شده به عنوان انتخابگر دهانه به 0.5
و facecolor
به یک خوب tab:blue
:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('AmesHousing.csv') ax.scatter(x = df['Year Built'], y = df['Total Bsmt SF'], alpha = 0.6) class EventHandler: def select_horizontal(x, y): ax.set_xlim(x, y) plt.draw() def reset(self): ax.set_xlim(df['Year Built'].min(), df['Year Built'].max()) plt.draw span_horizontal = SpanSelector(ax, EventHandler.select_horizontal, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='tab:blue')) button_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
button = Button(button_ax, 'Reset')
button.on_clicked(EventHandler.reset) plt.show()
اجرای این یک نمودار ایجاد می کند که می توانیم با تنظیم Axes-limits بر روی مقادیر ارائه شده، span ها را انتخاب کرده و بزرگنمایی کنیم:
اضافه کردن لغزنده
لغزنده به کاربران این امکان را می دهد که با کشیدن یک نشانگر و انتخاب یک مقدار، بین مقادیر زیادی به طور مستقیم انتخاب کنند. به طور معمول، از لغزنده ها برای به روز رسانی مداوم مقداری از یک نمودار، مانند محدوده آن استفاده می شود or حتی یک ویژگی به عنوان مثال، می توانید مقدار یک ثابت را از طریق یک نوار لغزنده تنظیم کنید، که به نوبه خود بر تابعی که به آن ثابت متکی است تأثیر می گذارد.
بیایید یک اسکریپت بنویسیم که به ما امکان می دهد محدودیت های محور Y و X را از طریق یک نوار لغزنده تغییر دهیم، که به ما اجازه می دهد منظری را که از آن داده های خود را مشاهده می کنیم تغییر دهیم:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2, left=0.2) df = pd.read_csv('winequality-red.csv')
plot, = ax.plot(df['volatile acidity']) class EventHandler: def update(val): ax.set_ylim(0, yslider.val) ax.set_xlim(0, xslider.val) plt.draw() xslider_ax = plt.axes([0.35, 0.03, 0.5, 0.07])
xslider = Slider( ax=xslider_ax, label="X-limit", valmin=0, valmax=len(df['volatile acidity']), valinit=len(df['volatile acidity']), orientation="horizontal"
) yslider_ax = plt.axes([0.03, 0.2, 0.07, 0.5])
yslider = Slider( ax=yslider_ax, label="Y-limit", valmin=0, valmax=3, valinit=1.5, orientation="vertical"
) xslider.on_changed(EventHandler.update)
yslider.on_changed(EventHandler.update) plt.show()
ما بالشتک را طوری تنظیم کردهایم که لغزنده در سمت چپ و پایین صفحه وجود داشته باشد Axes
، و یک Line Plot ساده ترسیم کرد. اضافه کردن یک نوار لغزنده مستلزم ساختن یک نوار لغزنده است Axes
برای آن، مانند اکثر ویجت های دیگر، و آن را به آن اختصاص دهید ax
استدلال از Slider
از طریق سازنده علاوه بر این، می توانیم حداقل، حداکثر و مقادیر اولیه اسلایدر را تنظیم کنیم. اینها معمولاً بر اساس دادههایی که ترسیم میکنید، محدودههای پویا هستند، اما میتوانند مقادیر اسکالر را نیز به صورت دستی تنظیم کنند.
در نهایت، Slider
s را می توان به صورت افقی یا عمودی جهت گیری کرد. از آنجایی که آنها قرار است به طور مداوم از طریق یک ماوس به روز شوند - این on_changed()
هنگامی که کاربر ورودی می دهد از تابع برای راه اندازی پاسخ استفاده می شود. ما بهینه سازی کرده ایم EventHandler
کلاس با یک update()
تابعی که به سادگی مقادیر X و Y-Limit را بر اساس تنظیم می کند val
ue از لغزنده مربوطه.
اجرای این کد یک نمودار با دو لغزنده تولید می کند که می توانیم از آنها برای تغییر دامنه استفاده کنیم. Axes
:
- دسترسی
- معرفی
- اجازه دادن
- قبلا
- دیگر
- API
- روش
- استدلال
- دور و بر
- شروع
- بودن
- جعبه
- ساخته شده در
- صدا
- اهميت دادن
- موارد
- تغییر دادن
- بررسی
- رمز
- ستون
- میتوانست
- زن و شوهر
- ایجاد
- جاری
- وضعیت فعلی
- داده ها
- وقف کن
- شناسایی شده
- دوجین
- پویا
- به آسانی
- لبه
- واقعه
- حوادث
- مثال
- عالی
- ویژگی
- امکانات
- نام خانوادگی
- تمرکز
- یافت
- تابع
- قابلیت
- سوالات عمومی
- رفتن
- بزرگ
- سبز
- داشتن
- کمک
- اینجا کلیک نمایید
- چگونه
- HTTPS
- اندیشه
- از جمله
- شاخص
- ادغام
- IT
- برچسب ها
- بزرگ
- محدود شده
- لاین
- فهرست
- ماتریس
- اکثر
- تعداد
- گزینه
- دیگر
- در غیر این صورت
- کارایی
- چشم انداز
- در حال حاضر
- فشار
- روند
- تولید کردن
- ویژگی
- رادیو
- محدوده
- RE
- پاسخ
- نتایج
- بازده
- ایمنی
- سعید
- مقیاس
- پرده
- انتخاب شد
- حس
- تنظیم
- محیط
- ساده
- کوچک
- So
- فضا
- شروع
- دولت
- بیانیه
- ایالات
- وضعیت
- عرضه
- پشتیبانی
- سیستم های
- آزمون
- از طریق
- زمان
- بالا
- بروزرسانی
- به روز رسانی
- us
- کاربران
- ارزش
- چشم انداز
- دید
- قابل رویت
- چه
- بدون
- مشغول به کار
- کارگر
- نوشته
- X
- سال
- زوم